BUILDING IN KOREA
Manballers Devlog — Episode 07
The Kakao Login Fight That Took Days
A library install and a few lines in app.json — that’s all I thought this would take. It turned into a multi-day war with three separate walls.
The app was finally running, barely. That turned out to be the easy part. The real fight was Kakao login — and I didn’t see it coming at all.
I assumed this would take an afternoon: install a login library, add a few lines to app.json, done. Instead it became a multi-day war fought across three separate walls.
01
Wall One — Version Conflict
The moment I installed the Kakao login library, a strange error appeared. expo-router and the Kakao login library each wanted a different, incompatible version of React. I assumed npm would sort this out automatically. It didn’t.
I ended up rebuilding the entire project from scratch, this time pinning the exact SDK version — 54 — from the very first step.
02
Wall Two — The Redirect Address
With versions aligned, I hit the Kakao login button and the login screen actually appeared. It went all the way to the consent screen — and then threw error code KOE006. A quick search told me this meant the redirect URI didn’t match what was registered.
Finding where to even enter this setting took a long time on its own. Guides online seemed to be describing an older version of the Kakao Developers interface than the one I was looking at. I assumed it would live under “Product Settings > Kakao Login.” It was actually buried deep inside “App > Platform Keys > REST API Key.”
03
Wall Three — It Doesn’t Come Back Automatically
With the redirect address finally correct, login itself succeeded — but the app never returned automatically afterward. It felt like the login page just spun in place and stopped.
Digging into why led to a structural wall. Expo Go is a general-purpose test app, which meant it fundamentally couldn’t redirect back to our app’s own unique URL scheme. Making that actually work meant building a real standalone app — which meant paying for an Apple Developer Program membership, over ₩130,000 a year.
At this stage, with zero real users, spending that money didn’t feel right yet. So I used a workaround instead: after Kakao login, the screen displays an authentication code, which I copy by hand and paste into an input field in the app. Not elegant in the slightest. But it worked.
At the time, I assumed this was purely temporary — something I’d fix properly once I found a better way.
Not elegant in the slightest. But it worked.
04
Everything Else That Happened in Between
While all of this was going on, a steady stream of smaller disasters kept interrupting.
Firebase Storage suddenly demanded a plan upgrade — Google had changed policy so the free tier no longer supported Storage at all. I registered a card, switched to the Blaze plan, and set up a budget alert just in case. (The amount billed so far has stayed close to nothing.)
The app.json file broke repeatedly — a single missing comma was enough to stop the entire app from launching, more than once. I hadn’t realized JSON was this unforgiving. One misplaced bracket or comma, and everything froze.
Some days, my computer and phone were on the exact same Wi-Fi and still couldn’t connect. It turned out to be the router’s AP isolation feature. I tested over a phone hotspot instead, allowed Node.js through the firewall, and it finally cleared.
And on one particular day, I discovered a notice that Kakao Map — previously free — had switched to a paid API. My stomach dropped until I confirmed that individual developer accounts get a free quota for their first registered app.
05
Automatic Login, Finally
The manual copy-paste workaround stuck around for a few weeks. Uncomfortable, but the app worked, so it stayed.
Then, stepping outside this chat for a while to try a different coding tool directly, I rebuilt the login flow from scratch. Combining a function called WebBrowser.openAuthSessionAsync with our own custom deep link address (manballers://oauth), I finally got Kakao login to genuinely, automatically return to the app afterward.
When I brought that code back into this chat and showed it to Claude, the response was: “This is exactly the part we struggled with for days — and you solved it precisely.” Not a developer, and I’d worked out, on my own, something that had taken days of back-and-forth to crack. That felt strange and genuinely rewarding at the same time.
Up Next
Episode 08 — Building It Up, Piece by Piece
Check-ins, map markers, ratings, a rank system, and a growing pile of small bugs that came with every new feature added.