I don't have a Bloomberg Terminal. What I do have is a VPS, some patience, and a portfolio of Indonesian stocks that keep making moves while I'm asleep. The problem isn't access to information — it's filtering the signal from the noise.

The problem with Indonesian stock news

Google News gives you everything. IDX announcements are buried in PDFs. Reuters covers the big moves but misses the commodity plays. Twitter is... Twitter. By the time I've sifted through three tabs and a half-dozen bookmarked sites, the market has already reacted.

What I needed was something that watched these sources continuously, understood which tickers I actually held, and surfaced only the stories that mattered. With summaries. At the edge, close to me.

The design constraints

I set three hard rules before writing code:

Zero infrastructure cost. I wasn't going to pay for a server to watch news. Cloudflare Workers has a generous free tier and runs at the edge — close to both the news sources and me in Jakarta.

No maintenance burden. If I'm on vacation, this thing keeps running. No cron jobs to restart, no databases to migrate. Static site, automatic rebuilds.

Actually useful output. Not raw links. Summaries I can scan in 10 seconds. Relevance scores. Clear indicators of which positions in my portfolio are affected.

Architecture in three layers

The system runs on three simple primitives:

1. Collection

Astro's static site generation is the backbone. During build, a custom data loader hits RSS feeds from Google News, Reuters, and IDX announcements. It parses the XML, extracts article URLs, and fetches full text where possible.

The scraping is intentionally lightweight — no headless browser, no complex JavaScript execution. Raw HTTP requests, HTML parsing with regex fallbacks, and graceful degradation when sites block or change layout.

2. Intelligence

Here's where it gets interesting. Each article gets run through a relevance scoring algorithm that checks:

  • Does it mention tickers I hold? (ADRO, ITMG, PTBA, ANTM, INCO, BBRI, BBCA, TLKM, plus my positions in ITMG, PTPS, ESSA, PGEO)
  • Does it cover commodities I track? (Coal, nickel, palm oil, oil)
  • Is it a duplicate of something I've already seen?
  • What's the source credibility and recency?

Articles scoring below 6/10 are dropped. Scoring 10/10 gets flagged for immediate attention. Everything else lands in the middle bucket — worth reading, but not urgent.

The summarization uses an LLM to extract 2-3 key bullets from full article text. This isn't just clipping the first paragraph — it's reading the whole piece, understanding the financial implications, and rewriting it for a portfolio holder's perspective.

3. Delivery

Output is static Markdown processed by Astro, deployed to Cloudflare Workers. The site updates every hour via a scheduled trigger. Build to live takes under 5 minutes.

The presentation is ruthlessly minimal. Each story shows: source, age ("21d ago"), headline, 2-3 key bullets, and affected tickers with impact ratings (🟢/🟡/🟠). No comments, no social features, no noise.

What I learned

Static sites can be dynamic. The line between "static site generator" and "application" is blurrier than the marketing suggests. When your build pulls live data and your host supports scheduled rebuilds, you get most of the benefits of a dynamic app with none of the server management.

Relevance filtering is harder than summarization. Getting an LLM to condense text is easy. Getting it to judge whether a coal price article actually affects your specific portfolio of Indonesian mining stocks — that requires context, ticker mappings, and careful prompt engineering.

The edge matters for scraping. Running requests through Cloudflare's network means I'm hitting news sources from dozens of different IP addresses, not a single VPS that gets rate-limited after the 50th request. It's not why I chose Workers, but it's a nice side effect.

What's next

The current system is read-only. I'm experimenting with adding sentiment tracking over time — is news coverage of nickel getting more positive or negative? Are certain sources consistently early or late to moves?

There's also a longer-term question about automation. Right now I read the summaries and make my own decisions. At what point does high-confidence scoring + consistent sentiment = actionable signal? That's a dangerous line to cross, and I'm not there yet.

Until then, I have a personal Bloomberg Terminal that costs nothing, never sleeps, and fits in a static site. For a side project, that feels like enough.