[portfolio](https://geonwoo.kim/en/portfolio) › Personal

# gloticker · macro indicators Chrome extension

https://geonwoo.kim/en/portfolio/gloticker

Period: 2025.03 — 2025.05

I built it because checking market indicators meant visiting 4–5 sites every time. I ran separate FastAPI collection and Spring Boot streaming servers on a home server.

300+ cumulative users across 7+ countries

- [github](https://github.com/gloticker)

Team: Solo

Role: Planning and design · FastAPI collection server · Spring Boot streaming server · Frontend · Home server · CI/CD · Monitoring

Java 17 · Spring Boot · Python · FastAPI · Redis 7.2 · React · Proxmox · Docker · Nginx Proxy Manager · Jenkins · Prometheus · Grafana

- Live index quotes: Nasdaq, S&P 500, Dow Jones, Russell 2000, 20-year Treasury, VIX, Fear and Greed Index
- Stock quotes: the Magnificent 7 (Apple, Nvidia, Microsoft, Amazon, Google, Meta, Tesla)
- Crypto quotes: Bitcoin, Ethereum, Solana, dominance
- Exchange rates: Dollar Index and the won against the dollar, euro, yuan and yen
- SSE live updates over a Redis message queue
- Market analysis with the ChatGPT API
- 30-day daily candle charts
- Settings for hidden items, theme and language

## Getting blocked while scraping

Problem: Frequent yfinance calls caused 429 errors, and some servers identified the client as a bot and returned 401 responses. I needed a call rate that kept prices fresh without getting blocked.

Solution: Forum reports suggested about one call per second, so I randomized call intervals between 1 and 1.2 seconds. Each call carried a valid random header so the scraper was not flagged as a bot. Values that change slowly, such as the Fear and Greed Index, dominance and exchange rates, update once a minute.

## API requests piling up on every popup

Problem: Opening the extension popup called the per-symbol price and change, chart, SSE subscription and analysis APIs at once. The home server needed protection from the resulting load.

Solution: Redis caches the latest data snapshot and sends it in one response, and the extension stores the latest data and its arrival time in local storage. One scraping round takes 23 seconds on average, so if the last update arrived within 20 seconds, the popup only subscribes to SSE. Charts use 30 days of daily candles, so they load once at market close, and Bucket4j limits each client to 6 requests per 10 seconds.

## Architecture

gloticker deployment diagram: Nginx, monitoring, Jenkins, and collection and streaming servers on Proxmox

Price collection and streaming servers run on Proxmox.

gloticker cover with the logo and name on a black background

gloticker logo cover

gloticker home screen with indices, stocks and mini charts

gloticker settings screen for picking stocks, crypto and exchange rates

gloticker with the AI market analysis panel open


[vortesso · coffee journal app](https://geonwoo.kim/en/portfolio/vortesso) · [underthekey · custom keyboard platform](https://geonwoo.kim/en/portfolio/underthekey)
