All projects

03 · Independent project · Live beta

Market Atlas

My personal stock-research space: price history, company facts, financial statements, and reported earnings in one place.

Open Market Atlas
A data-analysis workspace representing Market Atlas.

Focus

JavaSpring BootDockerREST API

Status

Live beta

Why I made it

I wanted one page that answered the next question too.

I built Market Atlas for myself. Most finance sites made it easy to find a price or market cap, but I kept moving between tabs when I wanted the company overview, several years of history, financial statements, and reported earnings together.

The idea was not to build a trading terminal. I wanted a calm research page where I could enter a ticker, see the important numbers, and continue looking without starting the search again somewhere else. The current coverage is focused mainly on selected U.S. stocks, which is enough for how I use it today.

How it works

A static website in front of a small Java service.

The interface is built with Astro. Behind it is a Java 21 and Spring Boot service with a REST API. That service combines market information from external APIs with financial statements and quarterly earnings from official U.S. company filings, then turns the different responses into one predictable format for the website.

Everything runs in Docker on my own Ubuntu server. Frequently used datasets are cached in memory and written to a persistent Docker volume, so revisiting a company does not create the same external request again. Older cached data can keep the page useful during a temporary outage, and selected snapshots are backed up separately.

A look inside

A small part of the Java service.

Small REST endpoints
@GetMapping("/{ticker}/financials")
public CompanyFinancials financials(@PathVariable String ticker) {
    return stockService.getFinancials(ticker);
}

@GetMapping("/{ticker}/history")
public StockHistory history(@PathVariable String ticker,
        @RequestParam(defaultValue = "5y") String range) {
    return stockService.getHistory(ticker, range);
}
Layered cache lookup
T diskFresh = persistentCache
    .read(namespace, key, type, freshFor)
    .orElse(null);

if (diskFresh != null) {
    staleCache.put(key, diskFresh);
    return new CachedResult<>(diskFresh, false);
}

T value = freshCache.get(key, ignored -> {
    T loaded = loader.get();
    persistentCache.write(namespace, key, loaded);
    return loaded;
});

Where it is now

It became a tool I actually keep open.

The live version includes a curated set of companies, five-year price views, company comparisons, annual financials, reported quarters, source links, and clear timestamps. It is still a beta and it does not pretend to cover every exchange or every security.

Building it taught me much more than how to draw a chart. I had to think about missing values, filing dates, request limits, cache freshness, backups, and what the interface should say when a source is unavailable. I still use Market Atlas in my own day-to-day research, which is the best reason I have to keep improving it.