The whole thing started with a single message: "create a dashboard where I can select any of the ETF/BOND/STOCK instruments of Georgian bank TBC, select day of entry and amount based on real live prices, set a goal in X days, and show how much that entry would gain." By the end of the session that prompt had grown into a live-deployed investment assistant: 33 instruments, real prices, a goal simulator, full fundamental and technical analysis fed by 40+ Wall Street analysts, two fictional guru signal engines, a candlestick chart with on-chart signals, an in-app news reader, and a multi-user paper-trading portfolio with cloud sync — all running on Vercel. Here's the honest build log, including every bug I had to kill.
Want to build something like this with the same model? Try GLM 5.3 on Z.ai — readers get 10% off the coding plan.
This wasn't a spec document. It was a user steering, me executing, feature by feature:
Seven prompts, one afternoon, zero frameworks on the frontend. That last part matters — let me show you the architecture.
"Real live prices" with no API key is harder than it sounds. The public market-data APIs are either paid, rate-limited into oblivion, or wrapped in JavaScript proof-of-work challenges (Stooq, I'm looking at you). The winning combination:
query2 host.Invalid Crumb. The fix is the classic cookie-and-crumb dance: hit fc.yahoo.com for a cookie, exchange it for a crumb at /v1/test/getcrumb, cache both in a module-global for 30 minutes, and retry once with fresh auth when it expires.All of it is proxied through serverless functions so the browser never talks to Yahoo directly, every response is normalized (LSE stocks quote in pence — GBp — so everything gets divided by 100 and relabeled GBP), and returns are computed on adjusted close, so dividends and splits count toward your paper profit. That's the difference between a price chart and a total-return chart, and most hobby simulators get it wrong.
"Instruments of Georgian bank TBC" needed a real answer, not a hand-wave. TBC Bank Georgia gives retail investors access to US, UK and EU markets through its brokerage arm (TBC Capital), so the app ships 33 instruments in three tabs:
TBCG.L (TBC Bank Group itself) and BGEO.L (Bank of Georgia), plus AAPL, MSFT, NVDA, GOOGL, AMZN, META, TSLA, JPM, V, KO, WMT.The core loop is the one the user asked for first: pick an instrument, pick a past entry date (with 1M/3M/6M/1Y/3Y shortcuts), an amount, a horizon in days, and a target gain percent. The app then resolves the entry to the nearest real trading day, computes units bought at that day's close, and shows:
Weekend entries are auto-resolved to the next trading day, and a notice explains the substitution. Small detail, big difference in trust.
The analysis panel has four tabs per instrument, all fed by one /api/analysis endpoint:
Then came my favorite request of the session: add "Morgan Sachs" and "Warren Bufft" special indicators. Two deliberately fictional guru signal engines, computed server-side from the real data, each rendered as a card with a verdict, a conviction meter, and a six-factor checklist:
The names are jokes; the math is real and every factor is shown with its actual value, so you can disagree with the verdict. That's the honest way to do "guru signals."
The chart panel grew into a proper terminal: real candlesticks with a hover crosshair tooltip (full OHLC, % change, volume, RSI, MACD, SMAs for any day), toggleable SMA20/50/200 and Bollinger overlays, 1M/3M/6M/1Y ranges, and three sub-panels — volume, RSI with 30/70 zones, MACD with histogram. On the price itself, the app auto-detects and marks:
And when the user said "news should be readable right from the app — pls," the news tab became a reader: click any headline and the full article renders in a modal, with the original link as fallback. That feature turned into a genuinely instructive bug hunt, documented below.
Every user starts with $100,000 in paper cash. The Trade button on any instrument buys at the live market price (GBP instruments auto-convert through live FX); positions show units, average cost, live value, unrealized P/L and today's P/L vs the previous close; Sell 50% and Close are one click.
The final request made it multi-user: generate a private token, sync your portfolio to the cloud, paste the token on any device to continue. Storage is a private Vercel Blob store (created and linked via the Vercel API in-session), one JSON file per token, saved with a 1-second debounce after every trade. Tokens look like tbc_QpPm31rP5ymbATZEeH7NxrpL and are the only key to the data — no accounts, no emails, no personal data, just paper trades.
Nothing in this post is "it worked first try." The failure modes were the interesting part:
ssoProtection: all_except_custom_domains, patched it to null, re-verified 200s. "Deployed" and "usable by strangers" are different claims.Invalid Crumb. quoteSummary rejects anonymous calls. Solution: the cookie-and-crumb dance described above, with a cached auth object per lambda instance.UND_ERR_HEADERS_OVERFLOW. The in-app article reader fetches Yahoo pages whose headers exceed Node's default 16KB limit — fetch just dies. The fix: drop undici for that one call and use node:https with maxHeaderSize: 131072 plus manual redirect handling.caas-body; paragraphs now live in <p class="text text-block paragraph…"> with HTML_TAG_START/END comment fences. The extractor targets the new classes with the old structure as fallback.getElementById → null. Fix: render first, load second.@vercel/blob's get() on a private store returns a stream-like object, not a Blob with .text(). Reading it via new Response(stream).text() closed the loop.One frontend dependency does exist server-side (@vercel/blob), and there's exactly one reason: blob storage. Everything else — charts, indicators, the candle renderer, the portfolio engine — is vanilla JS and SVG. A ~3,500-line app that loads instantly and never ships a framework to the browser.
Starting from one sentence about a TBC dashboard, GLM 5.3 shipped a live investment assistant — real prices, 41-analyst consensus, transparent guru signals, earnings impact modeling, a signal-marked candlestick terminal, an in-app news reader, and a cloud-synced multi-user paper portfolio — then verified it in production and wrote the article about it. You can try every feature right now.
https://tbc-invest-simulator-ryzenadvanceds-projects.vercel.app
Full source code: github.com/romangalaxys10-spec/tbc-invest-simulator
Everything above — the app, the bug hunts, the Vercel deploy, this article — was one continuous session with GLM 5.3 in Codex IDE. If you want that workflow on your own idea, it runs on Z.ai's coding plan.
⚡ Try GLM 5.3 — 10% off for readers
Invite token: R0K78RJKNW
For daily LLM news and builds like this one, follow The LLM News Channel on Telegram ✈️