Posts

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

Deploying a Free pages.dev Domain on Cloudflare Pages — How to Avoid the Workers Screen Bait-and-Switch

Click Create application and you get a Worker creation screen, not Pages. The full process of hunting down the hidden Pages entry point and shipping a static Next.js site on a free domain

#Cloudflare#Cloudflare Pages#Next.js#Deployment#GitHub

I Built My Own Ad-Free, Payment-Free Playground for My Kids — Kiosk Mode on the Web

An old MacBook, turned into a dedicated kids device with a web app I wrote myself — entering fullscreen, a parent lock, and a time limit, all built with nothing but browser APIs

#React#Next.js#Fullscreen API#PWA#Kiosk

And Just Like That, Fable 5 Was Gone — Vanished at 3 AM

How the Fable 5 model I happily used on the Pro plan suddenly disappeared from my usage list one night, replaced by a credits-required message

#Claude Code#Fable 5#Pricing

Syncing Obsidian on Mobile via Git Was Too Painful, So I Built My Own Note App (RepoNote Dev Log)

Git on mobile Obsidian was complex and conflict resolution unbearable, so I built a Flutter note app that auto-syncs with a GitHub repo — including the part where I built it in React Native first and threw it out

#Flutter#GitHub API#Obsidian#React Native#Riverpod

Editing Video from Just YouTube Links — A Next.js + FastAPI + yt-dlp + FFmpeg Dev Log

What I learned building a personal web editor that pastes a YouTube link, lets you pick segments, and stitches them into one MP4

#FastAPI#Next.js#FFmpeg#yt-dlp#Claude Code

The Fable 5 Rollercoaster — Blocked, Then I Thought It Was Over, Then Extended

Fable 5 got blocked by a US government request, then I used it like crazy up to the last day before the switch to pay-per-use, thought it was over, and then it got extended — a month-long log

#Fable5#Anthropic#AI#Essay

Get $100 in free ChatGPT credits.

Get free ChatGPT credits.

#ChatGPT#Free Credit

Solo SaaS Payments — Starting With Stripe, Ending Up on Paddle

How I finished wiring Stripe subscriptions into MatchDa, only to discover four days later that the account country itself made the whole setup unsustainable — and the technical lessons from migrating to Paddle (Merchant of Record)

#Paddle#Stripe#Payments#SaaS#Webhook

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

#Blockchain#Solidity#Hardhat#Ethereum#Claude Code

[Pixel Village Part 1] Building an RPG Village Inside a Blog — Three.js 2D Top-Down Setup

The first step in building a 90s-RPG-style top-down village in a Next.js blog with Three.js OrthographicCamera — keyboard movement, AABB collision, and camera tracking

#ThreeJS#NextJS#React#PixelVillage#SideProject

[Pixel Village Part 2] Drawing Pixel Art in Code, With Zero Image Files

How to define sprites as ASCII strings, draw them onto a canvas, and use them as Three.js textures — NearestFilter, a 3x5 pixel font, and Y-sorting

#ThreeJS#Canvas#PixelArt#PixelVillage#SideProject

[Pixel Village Part 3] Opening the Library Door — Scene Transitions and Blog Data Integration

Fade transitions for entering buildings, preventing an infinite back-and-forth loop, and stocking the library bookshelf with real blog posts based on tags

#ThreeJS#NextJS#React#PixelVillage#SideProject

[Pixel Village Part 4] A Guestbook That Grows Into Trees — a GitHub JSON Store and 288 Faces

A guestbook easter egg where writing on a stone tablet plants a tree with a face somewhere in the grass. Storing it via GitHub commits with no DB, blocking spam, and giving each tree a random face

#NextJS#GitHub#API#PixelVillage#SideProject

Showing a Game Overlay on the Home Screen — Once Per Session, So It Doesn't Get Annoying

How to show a pixel game as a full-screen overlay on the blog's first visit to home, without annoying repeat visitors, using sessionStorage, and a stacking-context bug where the X button got hidden behind the Nav

#NextJS#React#UX#sessionStorage#PixelVillage

Automating Blog Publishing (10): When You Need to Log Into Someone Else's Account — Why I Chose Browserbase, and How to Actually Use It

Why I chose Browserbase as the way to connect someone else's Tistory/Naver account without our code ever touching their password, and the actual integration code from session creation to login detection

#Browserbase#Playwright#SaaS#Browser Automation#Next.js

Automating Blog Publishing (8): The Time Deploying Monetization Code Nearly Killed Auto-Publishing, Silently

During a multi-tenant conversion turning a personal tool into a monthly-subscription SaaS, a single deploy nearly stopped daily auto-publishing with nobody noticing — and the recovery that followed

#Next.js#Redis#SaaS#Troubleshooting#Vercel

Automating Blog Publishing (9): <dialog open> Isn't a Modal — And the Deploy URL That Wouldn't Update

Why a native dialog tag with only the open attribute doesn't become a real modal, and a deployment-alias problem where the same project showed an old screen depending on which URL you visited

#React#CSS#Vercel#Troubleshooting#Next.js

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

#Deep Learning#Big Data#Career#PyTorch#SQL

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

#Claude API#RAG#Prompt Engineering#Next.js#Refactoring

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

#LLM#Ollama#LoRA#RAG#MLX

It's Definitely Saved in the DB, But Not on Screen — the Trap useState's Initial Value Sets

How I tracked down and fixed a common React bug — a component that copied server data into local state for drag-and-drop, then kept ignoring fresh data the server sent down afterward

#React#useState#Next.js#Bug Tracking#State Management

Search Console's Excluded-From-Index Report — Not Everything Needs Fixing

Diagnosing 7 exclusion categories on a multilingual Next.js blog's Search Console report, one by one, separating what needs fixing from what should be left alone

#Search Console#SEO#Next.js#i18n

I Told the AI to "Pretend You're a Job Seeker and Try It" — It Caught a Real Bug

Creating a fictional job-seeker persona and driving it through a headless browser from signup all the way to RAG tailored-resume generation, and how I fixed the AI fact-fabrication bug found along the way

#Playwright#Claude API#RAG#QA Automation#Prompt Engineering

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

#ImprovMX#Email#DNS#Gmail#Domain

Workspace Upgrades (1): The Problem of Company Names Getting Cut Off in Kanban Cards

Fixing a kanban card layout where the status dropdown and the company name were fighting for space on the same line, by moving the status badge down to its own row

#React#Tailwind#UI Design#Layout

Workspace Upgrades (2): Making the "AI Analysis" Button Actually Write the Resume

Turning a button that only compared a job posting against a resume into one that directly rewrites the resume to fit the posting, redesigned as a clean 2-stage (analyze → translate) flow

#Next.js#Claude API#Server Actions#UX Design#Prompt Engineering

Workspace Upgrades (3): The Bug Where the Korean Name Showed on the English Resume, and Adding Contact Fields

Fixing a Korean-name-exposure bug caused by a single English-translation prompt rule, and adding editable phone number and portfolio link fields to the resume contact line

#TypeScript#Prompt Engineering#React#UX Design

Workspace Upgrades (4): Adding Kanban Card Drag-and-Drop With dnd-kit

Using dnd-kit, which was already installed but unused, to let dragging a kanban card between columns change its application status — and making sure clicks and drags never conflict

#dnd-kit#React#Drag and Drop#Next.js

3 KakaoTalk Screenshots Uncovered a Hidden Bug Spread Across the Entire Service

Following up on a small UI bug report from a real-device mobile screenshot led to discovering — and fixing — a root-cause bug where Claude thinking-response handling was done wrong in 20 different places

#Claude API#Mobile UX#Next.js#Bug Tracing#Prompt Engineering

Paddle Domain Review: Matchida (Typeform Survey) Answer Guide

Paddle Instead of Stripe for SaaS Payment Systems... Guide to Answering the Paddle Survey

#Paddle#Stripe

Automating Blog Publishing — Building a Personal Automation Platform for Tistory and Naver (1) Overall Architecture

The story of designing, from scratch, a personal blog automation tool that writes an AI draft the moment you register a topic and publishes it via browser automation

#Automation#Node.js#TypeScript#Claude API#Side Project

Automating Blog Publishing (2): Auto-Generating Drafts in My Own Style With the Claude API

How a single style-guide document made the Claude API write blog drafts in my own voice every time, and the fallback path that let it run without an API key

#Claude API#Prompt Engineering#Node.js#TypeScript#Automation

Automating Blog Publishing (3): Auto-Publishing to Tistory With Playwright — A Story of Failing Three Times

A record of actually fixing a Tistory login session that kept disappearing, and a publish failure caused by grabbing the wrong markdown editor selector

#Playwright#Browser Automation#Node.js#Troubleshooting#Tistory

Automating Blog Publishing (4): Building a Local Web Dashboard With No Framework

Building a local dashboard that handles topic registration, draft review, and publishing using nothing but Node.js's built-in http module, and why I chose not to deploy it to the cloud

#Node.js#Web Dashboard#Playwright#Vercel#Side Project

Automating Blog Publishing (5): Taking a Local Tool to the Cloud — Vercel Blob Betrayed Me

The story of eventually putting a tool on Vercel that I had concluded a local dashboard was good enough for, and switching to Upstash Redis after running into Vercel Blob eventual-consistency problems

#Vercel#Redis#Upstash#Serverless#Architecture

Automating Blog Publishing (6): Why Only the Title Went Up and the Body Vanished — The Trap CodeMirror Was Hiding

Tracing and fixing a bug where the publish log looked fine and the RSS title looked fine, but the actual post body kept coming out empty — viewed through the lens of CodeMirror and React state synchronization

#Playwright#CodeMirror#React#Troubleshooting#Tistory

Automating Blog Publishing (7): Assigning a Category to Auto-Published Posts

How I dug into the actual structure of Tistory's category-selection dropdown and attached auto-selection logic, to fix posts that kept going up with no category assigned

#Playwright#Tistory#Browser Automation#Troubleshooting

Hardening MatchDa (1): The Audit That Started With "Check If There Are Any Security Problems"

A security audit log covering a missing-auth API route, a cross-user delete bug, and a plaintext password sitting in a public repo — all found by sweeping the whole service

#Security Audit#Next.js#Supabase#RLS#Server Actions

Hardening MatchDa (2): Completely Erasing a Password From History With git-filter-repo

A record of using git-filter-repo to substitute a plaintext password out of an entire commit history in a public GitHub repo, all the way through to a force-push

#git#git-filter-repo#GitHub#Security#History Rewriting

Hardening MatchDa (3): Merging 15 Migrations Into One schema.sql and Verifying It

Consolidating a fragmented set of Supabase migration files into a single schema file, and automatically cross-checking it column-by-column against the actual production DB via the PostgREST API

#Supabase#PostgreSQL#DB Backup#Schema Management#Python

Hardening MatchDa (4): Designing a Viral Loop With a Public Resume-Sharing Link

Building a resume-sharing page viewable without login (/r/slug), designed with privacy protection and search-engine deindexing in mind from the start

#Next.js#Supabase RLS#Viral Loop#Growth Strategy#Privacy

Hardening MatchDa (5): Only One Education Entry Ever Showed — The Type Design Was the Problem

Tracing a bug where a resume always showed only one education entry, and finding the cause was a type designed as a single object instead of an array

#TypeScript#React#Bug Tracing#Type Design#Next.js

Why We're Returning to a Strategy of Reducing the Number of Tokens

AI ultimately moves at the pace of humans.

#tokens#Human#AI

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

#Cladue Fable 5#Mythos#Fable 5

Building a SaaS With an AI Coding Assistant (10): From Forgot Password to the Eye Icon — Closing Out Auth UX

The truth behind Supabase deliberately responding "as if successful" to a signUp for an already-registered email (an empty identities array), a one-line next-parameter design that blocks open redirects, and how I knowingly dodged this time the exact admin API trap that caused the data-loss incident in Part 2

#Supabase#Next.js#Authentication#UX#AI Coding Assistant

Building a SaaS With an AI Coding Assistant (11): "Confirm Your Signup" Is Too Bland — Branded Emails and Resend SMTP

Two email HTML templates built back in table-layout-and-inline-styles style, an unexpected Mailgun MX record discovered via dig, a 401 scare from a send-only restricted key — the story of replacing Supabase's default auth emails with branded ones and wiring up Resend SMTP

#Resend#Supabase#Email#DNS#AI Coding Assistant

Building a SaaS With an AI Coding Assistant (12): Where Does support@matchda.com Actually Go? — Building Domain Email Receiving

A dead Mailgun MX record exposed by dig, the twist of "oh...no Mailgun...and it costs money...", ImprovMX forwarding wrapped up with zero lines of code — the infrastructure detective story of turning support@matchda.com, which had only ever existed in a policy document, into an address that actually receives mail

#ImprovMX#DNS#MX Records#Email#AI Coding Assistant

Building a SaaS With an AI Coding Assistant (1): Rebuilding the URL Structure From Scratch

How I cleaned up MatchDa's tangled URL structure and redesigned the discover/applications flow off a single piece of user feedback

#Next.js#SaaS#AI Coding Assistant#Product Design#Claude Code

Building a SaaS With an AI Coding Assistant (2): The Day the AI Deleted My Account

An incident where a hidden filter bug in the Supabase admin API led my AI coding assistant to delete a real user account, and the DB safety rules I put in place afterward

#Supabase#Claude Code#Incident Response#DB Safety#SaaS

Building a SaaS With an AI Coding Assistant (3): A RAG Tailored Resume, Built Without Embeddings

From auto-analyzing an uploaded resume file, to a RAG-style tailored resume implemented with nothing but keyword overlap and no extra infrastructure, to DOCX/PDF downloads that keep the on-screen formatting

#RAG#Claude API#Next.js#Resume Automation#SaaS

Building a SaaS With an AI Coding Assistant (4): One-Click Collection, a Chatbot, and Going Paid for the First Time

One-click collection of big-name job postings verified against public ATS APIs, a support chatbot that only explains how to use the product, and turning a free SaaS into a paid one with Stripe subscriptions

#Stripe#Claude API#SaaS#Next.js#Subscription Billing

Building a SaaS With an AI Coding Assistant (6): A Logo Mismatch, Managing 171 Postings, and Ctrl+A-Paste Analysis

Fixing a brand mismatch where the favicon and the in-app logo differed, the management problems that emerged once collected postings ballooned to 171 (edit mode, unscored filter), and AI analysis of a pasted-in full job description for sites where scraping fails

#Next.js#Claude API#SaaS#UX#AI Coding Assistant

Building a SaaS With an AI Coding Assistant (7): Turning a Design Handoff File Into a Landing Page Demo Showcase

How I added three demo showcases (resume translation, job discovery, applications kanban) that reproduce actual product screens on a landing page that had only ever had a hero and feature cards — the story of a dormant design handoff file getting a second life as a marketing asset

#Next.js#Tailwind CSS#SaaS#Landing Page#AI Coding Assistant

Building a SaaS With an AI Coding Assistant (8): Killing Dead Links — Making Every Click on the Landing Page Go Somewhere

The landing page looked convincing with demo showcases, but actually clicking through it revealed holes everywhere — wiring the hero search to job discovery, opening the pricing page to logged-out visitors, and adding a new about page so all 4 header nav items finally worked

#Next.js#SaaS#Landing Page#Middleware#AI Coding Assistant

Building a SaaS With an AI Coding Assistant (9): The "Grown-Up" Parts of a SaaS — Settings and Legal Documents

How I wired up a settings page, password change, terms of service, privacy policy, and support page in a single day for an app where clicking the avatar in the top-right corner did nothing — including a two-step pattern (anon client + admin API) for "verifying the current password," something Supabase has no API for

#Next.js#Supabase#SaaS#Authentication#AI Coding Assistant

From JobRadar to Matchda — A Side Project Rebranding Story

The naming criteria and branding decisions behind renaming the feature-descriptive "JobRadar" to Matchda

#Branding#Naming#SideProject#matchda

Building a React Autocomplete Chip Input From Scratch — Catching the Click Before the Blur

Notes from building an autocomplete chip input without a library — the mousedown-vs-blur ordering trap and preventing uncommitted text from getting lost

#React#TypeScript#UI Components#Tailwind CSS

The Last 20% of a Rebranding Migration — Bulk sed Replacements and the Onboarding Banner That Quietly Vanished

How I cleaned up 17 leftover screens while ripping out the Tailwind zinc palette for brand hex tokens, and the story of discovering that the onboarding entry point had disappeared entirely after switching to the new shell

#Tailwind CSS#Rebranding#Design Systems#Next.js

Breaking Through Bot-Blocked Job Scraping With a Three-Tier Fallback (Direct Fetch → Stealth Browser → Reader Proxy + AI Extraction)

How I revived job-posting collection that had been getting nothing but 403s from Seek's Kasada bot protection, using the r.jina.ai reader proxy and Claude Haiku structured extraction — plus a debugging detour where I confused "blocked" with "expired"

#Scraping#Jina AI#Claude API#Playwright#Next.js

Turning an AI-Generated Logo Into a Real Favicon — a Next.js Favicon Build Log

Turning an AI-generated logo image into a real Next.js favicon — from checking it at 16/32px, to hand-building favicon.ico, to color-matching

#Next.js#sharp#favicon#Node.js

Trying Out Jina AI: Making Job Postings Readable by an LLM, and Matching Them to Resumes

From Reader turning URLs into markdown, to embeddings and rerankers — why matchda is adopting Jina AI for job matching, and hands-on usage

#Jina AI#LLM#Embeddings#Web Scraping#matchda

Turning a Design Demo Into the Real App (1) — When Two Apps Coexist

Discovering that a pretty design demo and the real logged-in app were living separate lives, and building an inventory and phase plan to replace one with the other with zero feature loss

#Next.js#Supabase#Refactoring#Server Actions

Turning a Design Demo Into the Real App (2) — Reusing Modals and Swapping the Route

Porting per-job features by reusing existing modals via a slot pattern, and swapping the logged-in home into the MatchDa dashboard through conditional chrome (AppChrome) and component extraction

#Next.js#App Router#React#Server Actions

Turning a Design Demo Into the Real App (3) — Unifying the App Shell and Bulk-Mapping the Color Tone

Wrapping the remaining pages in a shared app shell to unify the chrome, then bulk-replacing zinc colors with brand tones in one perl pass — including the trap I hit along the way

#Next.js#Tailwind CSS#perl#Refactoring

When Your GitHub Grass Has Gaps, How to Fill Them With Backdated Commits (Honestly)

How to create past-dated commits with GIT_AUTHOR_DATE and GIT_COMMITTER_DATE to fill in grass gaps, and what actually counts as a contribution

#Git#GitHub#Contribution Graph#Productivity

Turning a Design Handoff Into a Real Product (1) — Reproducing an HTML Reference in Next.js

Reproducing a .dc.html design handoff built on a custom runtime, pixel-close, using our existing Next.js codebase's tokens, i18n, fonts, and components

#Next.js#Tailwind CSS#i18n#TypeScript

Turning a Design Handoff Into a Real Product (2) — Mock Data to Real Data, and Promoting the Public Landing

Wiring the MatchDa screens that ran on mock data to real Supabase data, promoting the design demo landing into the real first screen, and adding mobile responsiveness

#Next.js#Supabase#Server Components#Tailwind CSS

Turning a Design Handoff Into a Real Product (3) — Wiring CTAs and Search Into the Real Login Funnel

Wiring the landing's demo-link CTAs and search into the real login/signup funnel with Server Actions and useRouter, and handling useSearchParams with Suspense

#Next.js#Server Actions#React#App Router

Turning a Design Handoff Into a Real Product (4) — Optimizing a Resume Per Job Posting With Claude, and a Bug a Test Caught

Building an AI feature that analyzes an English resume against a job posting into highlights and an optimization note using Claude, applying anti-hallucination and caching, and catching a note-duplication bug through real testing

#Claude API#Next.js#Supabase#AI

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

#Next.js#Server Actions#Supabase#TypeScript

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

#Next.js#Favicon#sharp#SVG#Branding

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

#CSS#TailwindCSS#Next.js#Dark Mode

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

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

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

#Vercel#GoDaddy#Supabase#DNS#OAuth

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

#Web Scraping#Cloudflare#Playwright#Vercel#Debugging

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

#dnd-kit#React#Next.js#Supabase#PostgreSQL

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

#Claude Code#Subagent#Code Review#Security#Automation

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

#Web Scraping#fetch#Next.js#Vercel#cheerio

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

#Supabase#Next.js#PostgreSQL#Claude API

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

#macOS#grep#Absolute Paths#Dev Environment#Troubleshooting

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

#iTerm2#Terminal#Font#Claude Code#macOS

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

#iTerm2#macOS#Terminal#Localization

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

#git#macOS#Android#Secrets Management#Dev Environment

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

#macOS#Finder#Terminal#Productivity

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

#Next.js#Claude API#Supabase#Onboarding

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

#pnpm#Expo#React Native#Monorepo#Apple Silicon

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

#React Native#Expo#Android#Gradle#Troubleshooting

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

#React Native#Expo#npm#nvm#Node.js

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

#AI Native

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

#NextJS#Admin#UX#DeepL

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

#Claude Code#direnv#Dev Environment#macOS

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

#ChainPlay#SideProject#App Development#YouTube

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

#Android#GitHub Pages#Deep Link#React Native#Expo

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

#React Native#Expo#oEmbed#GitHub Pages#Deep Link

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

#JSZip#Claude API#DOCX#Next.js#TypeScript

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

#NextJS#SEO#GoogleSearchConsole#next-intl#Debugging

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

#Next.js#Supabase#Server Actions#TypeScript#SideProject

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

#GooglePlay#Android#App Publishing#IARC

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

#Next.js#i18n#next-intl#Multilingual

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

#Next.js#React#Responsive Design#Tailwind CSS

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

#AdSense#SEO#React#SideProject

Koreans say 'better than expected' more than expected

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

#thoughts

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

#React Native#TypeScript#Refactoring#ChainPlay

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

#git#branch#Collaboration#Version Control

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

#GitHub API#GraphQL#Next.js#Troubleshooting

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

#GitHub API#Next.js#Tree API#Troubleshooting

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

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

#Android#GooglePlay#Private testing#App Publishing#Game Development

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

#Android#Gradle#Dev Environment#Disk Management

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

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

#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

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

#Next.js#UI#Blog#React

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

#NextJS#SEO#GoogleSearchConsole#Debugging

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

#NextJS#SEO#next-intl#GoogleSearchConsole

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

#NextJS#AppRouter#Debugging#UX#CSS

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

#Android#AAB#GitHub#Git#ReactNative

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

#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

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

#Google Play#App Publishing#Privacy Policy#COPPA#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

#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] Cassette Player App Dev Log — From Day One to the First Week

A cassette player app born out of nostalgia for tape culture — the first week bouncing between Replit and Claude Code

#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

[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

Turning 40 and Starting Over as a Developer — I Was a Legacy Developer

From developer to PM, and back to development with AI five years later — why I started this blog and how I'm teaching myself again

#BackToDev#AI Development#Essay