[Dev Log] 2026-07-04
Today I wrapped up two big pieces of work at once: a full audit of the Korean market data stack behind my AI investing assistant (langAlpha) and building the morning-briefing automation end to end, plus a pipeline that monitors listed-company credit rating changes daily and was originally meant to be delivered over Telegram (that part got cancelled).
Brokerage API research — official and unofficial Toss endpoints were mixed in one file
For Toss, before their official openAPI existed, I had patched in an unofficial MCP (https://github.com/JeongSeongMok/tossinvest-openapi-mcp). When the official openAPI came out recently I did more work on top of it, and in the process discovered that unauthenticated unofficial endpoints and the OAuth-authenticated official Open API were mixed together on a single server. That meant any environment without an IP whitelist entry had to disable everything at once — inconvenient. I split them into two: 6 endpoints that need auth and 10 that don't, which made it much cleaner to toggle features per environment. I also added a single-ticker real-time quote tool.
Daytona's free tier blocks outside access
I found that the Naver Finance integration had been silently broken for weeks. I used to run this through Daytona in Docker, and this issue alone probably cost me over a week. Daytona blocks access to Naver Securities — at first I assumed I'd been rate-limited from too many requests and burned a lot of time "fixing" that. I worked around it by extracting the data before hitting Daytona and feeding it in that way, and later, once I realized several sites were blocked from that environment, moved the whole thing to Docker on my own machine. But it turns out the Naver Finance integration came back online and I forgot to re-enable it. While cleaning up the domestic data pipeline today, I noticed it was still switched off and fixed it.
Morning briefing pipeline
The biggest piece of work was the pipeline that automatically builds the Korean market morning briefing and publishes it to the blog every day. The principle I cared about most in the design was "numbers come from tools, words come from AI" — fully separating the data-collection step from the writing step so there's no room for the AI to invent or garble a figure in between. I'm also trying to pull in as much unique information as possible to differentiate it from other briefings.
If the market is closed, it just skips the briefing instead of forcing one out.
Credit rating monitoring pipeline
The other track automatically crawls rating-change disclosures from Korea's three major credit rating agencies (Korea Ratings, NICE Investors Service, Korea Investors Service) into a DB, has AI analyze the previous day's changes, and was originally recommended by Gemini to be delivered every morning over Telegram — but I don't use Telegram, so I removed that part. (When you have Gemini do a task, it sometimes does extra work you never asked for, which then needs cleaning up... it acted a bit too eagerly here, and honestly Gemini has been a little disappointing at work too. I wish the next version shipped soon and stopped jumping ahead of what was actually asked.)
All three agencies use different table structures, so there was more parser-wrangling than I expected. Still, seeing the first test collect 159 records with 155 of them landing correctly felt pretty good.
Today's takeaway
I'm trying to run this blog, but I still don't know the web side as well as I know development, so there's been a lot of trial and error and a lot of back-and-forth on design and how to run the site. I tried to brainstorm ideas with AI on this... and that didn't really work out.