stockinfo

stockinfo

Docker app from UnraidUser-3287583290's Repository

Overview

StockInfo provides stock and ETF quotes via a REST API (JSON), caches them in a SQLite database and refreshes them periodically. Backend (FastAPI) and dashboard (Vue) run in a single image on one port — the dashboard is served at the root URL, the API under /quote, /instruments, etc. Default data sources: yfinance (Yahoo), justETF, OpenFIGI. Sources are configurable in sources.yaml and can be replaced by plugins.

No official APIs: the default sources justETF and Yahoo Finance do not offer a public API for this data. StockInfo reads their public web pages through the open-source libraries justetf-scraping and yfinance. Whoever runs StockInfo is responsible for using the configured sources in line with the providers' terms.

Do not put StockInfo on the internet. It has no login — anyone who can reach it can change or delete your data. Use it only in your home network. From outside, connect to your home network with a VPN, for example WireGuard or Tailscale.

Whatever the sources do not deliver can be entered by hand in the expandable detail area of a row — provider, replication, fund size, domicile, currency, TER, volatility and accumulating/distributing. The source always wins: a manual value fills a gap, it never overwrites, and it applies again as soon as the source goes quiet.

Timezone: the "Timezone" setting (TZ) defaults to UTC — set it to your local zone for correct log timestamps. Valid values (TZ identifier column): https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

OpenFIGI (optional): resolves an ISIN to the ticker at your preferred exchange (see "Default exchange"). It works without an API key, but only within OpenFIGI's low anonymous rate limit — once exceeded, resolution falls back to Yahoo search, which may return a different exchange or currency. A free key raises the limit and makes resolution reliable; enter it under "OpenFIGI API key". Register and create a key: https://www.openfigi.com/api

Support: StockInfo is built for its author's own use and shared free of charge. Issues are read, but there is no promise of a reply, a fix or a new feature.
StockInfo icon

StockInfo

Self-hosted stock and ETF quotes with a REST API and a web dashboard.

English · Deutsch

Features · Quick start · Configuration · Docker guide · Developer guide

StockInfo fetches stock and ETF quotes, keeps them in a local database and serves them as JSON. You query by ISIN or by symbol and exchange; the answer contains price, currency, time, name and, for ETFs, metrics such as TER, provider and fund size.

A web dashboard shows your instruments, price charts and fund metrics, in English and German. Scripts, spreadsheets and other apps use the REST API.

StockInfo dashboard

The Assets page: every instrument with its latest price and metrics. The price history of the selected row is docked at the bottom.

[!WARNING] StockInfo has no login: anyone who can reach it can change or delete its data. Do not put it on the internet. Run it only in your home network and connect from outside through a VPN, for example WireGuard or Tailscale.

Contents

Features

  • Quotes by ISIN or symbol – European and US stocks and ETFs; the preferred exchange is configurable (default Xetra).
  • Automatic updates – a background job refreshes all known instruments at a set interval; repeated requests are answered from the local database.
  • Price history – an intraday curve and end-of-day closes from one week to "max".
  • Fund and stock metrics – volume and 1-year volatility; for ETFs also TER, provider, replication, fund size, domicile, fund currency and distribution policy.
  • Your own values – fill in what no source provides; a source value always takes precedence.
  • Assets page – sortable columns, links to each instrument's profile on extraETF and Yahoo Finance, and the JSON answer of each request to copy.
  • Exchange rates – the FX page and GET /fx convert between currencies.
  • Live analysis – the Analysis page measures each configured source role by role, bypassing the cache.
  • Trading venues – the Exchanges page lists exchange suffixes, regions and currencies.
  • Settings – Appearance (14 themes), Language (English, German, or follow the browser), API & Links, Backups of the database, Environment (current configuration) and About.
  • Configurable sources and plugins – replace or extend the default sources, or run on a file you maintain yourself.

Your own values

Whatever the sources do not deliver can be entered by hand in the expandable detail area of a row. A manual value fills a gap and never overwrites a source value; it applies again as soon as the source stops providing one. This is the intended route for TER and fund size of ETFs outside Europe, which no free source states reliably.

Detail area

↑ Contents

Data sources

The default setup uses these free sources:

Source Used for
Yahoo Finance prices, currency, volume, name and daily closes for stocks and ETFs; fund provider for ETFs outside Europe
justETF metrics of European (UCITS) ETFs: TER, provider, replication, fund size in millions of EUR, 1-year volatility, distribution policy
OpenFIGI finds the listing of an ISIN at your preferred exchange
Yahoo search fallback when OpenFIGI cannot resolve an instrument

Sources are set in sources.yaml next to the database. A bundled file source can supply data you maintain yourself, as a fallback or on its own.

See source configuration and the plugin author guide.

No official APIs. justETF and Yahoo Finance offer no public API for this data. StockInfo reads their public web pages through the open-source libraries justetf-scraping and yfinance. justETF's terms of use, for example, forbid automated price queries and excessive load.

StockInfo fetches no prices from justETF, only fund data: once per ETF every METADATA_TTL_DAYS (default 7), plus when you refresh a single instrument by hand.

Whoever runs StockInfo is responsible for using these sources in line with the providers' terms.

To avoid them, remove them from sources.yaml or use the file-only profile.

↑ Contents

StockPortfolio: the companion app

StockInfo works on its own. The optional StockPortfolio manages your own portfolios: it values your positions, shows how far they are from their target allocation and calculates rebalancing trades. It needs StockInfo for every price, exchange rate and fund metric.

flowchart LR
    Browser --> SP["StockPortfolio"]
    Browser --> SI["StockInfo<br/>(dashboard + REST API)"]
    Scripts["Scripts, spreadsheets"] --> SI
    SP -- "prices, FX rates,<br/>fund data, history" --> SI
    SI --> DB[("SQLite<br/>/data")]
    SI --> SRC["Yahoo Finance, justETF,<br/>OpenFIGI, your files"]
StockInfo StockPortfolio
Purpose Quotes, price history, fund metrics Portfolios, valuation, rebalancing
Runs on its own Yes No – needs StockInfo
Docker image mangolila/stockinfo mangolila/stockportfolio

Set up StockInfo first, then StockPortfolio.

StockPortfolio's setup guide explains how to point it at your StockInfo address.

↑ Contents

Quick start

You need Docker. The image contains the backend, the dashboard and all dependencies.

docker run -d \
  --name stockinfo \
  --restart unless-stopped \
  -p 127.0.0.1:8000:8000 \
  -v stockinfo-data:/data \
  mangolila/stockinfo:latest

Open http://localhost:8000/ for the dashboard and http://localhost:8000/docs for the interactive API documentation. A first query:

curl http://localhost:8000/quote/IE00B3RBWM25

The example is reachable only from the Docker host. The Docker guide explains access from your home network, Docker Compose, data and permissions, updates, backups and security.

For Unraid, see the Unraid guide.

↑ Contents

Configuration

Setting Default Meaning
Port 8000/tcp 8000 Dashboard and REST API; map it to any host port
/data volume – Database, source configuration and backups; keep it when updating
DEFAULT_EXCHANGE XETR Preferred exchange for ISIN queries (MIC code)
REFRESH_INTERVAL_HOURS 6 Interval of the background refresh
OPENFIGI_API_KEY empty Optional key for a higher OpenFIGI rate limit

All settings are described in the Docker guide.

↑ Contents

Development

Setup, commands, the REST API reference, tests and the release process are described in the developer guide.

↑ Contents

Further documentation

↑ Contents

Support

StockInfo is built for its author's own use and shared free of charge.

Issues and pull requests are read, but there is no promise of a reply, a fix or a new feature.

↑ Contents

License

Copyright © 2026 Michael Mitterer. MangoLila GmbH is the provider and licensor.

StockInfo is licensed under the EUPL 1.2, version 1.2 only. It permits personal and commercial use, changes, redistribution, sale and hosting without a paid license.

If you redistribute StockInfo or a changed version, or offer it as a network service, keep the copyright and license notices, mark your changes and provide the corresponding source under the license's copyleft rules.

The warranty and liability exclusions in EUPL Articles 7 and 8 also apply to consumers, as far as the law permits. Mandatory rights remain unaffected, including liability for intent, gross negligence, personal injury and product liability. No additional guarantee is given.

The independent plugin_api/ package remains under MIT. Third-party components retain their own licenses.

Contact: office@MangoLila.at.

Details: LICENSE · German license text · Provider and consumer declaration · Third-party notices

↑ Contents

Media gallery

1 / 3

Download Statistics

1,528
Total Downloads

Related apps

Details

Repository
mangolila/stockinfo:latest
Last Updated2026-08-19
First Seen2026-07-22

Runtime arguments

Web UI
http://[IP]:[PORT:8000]/
Network
bridge
Shell
bash
Privileged
false

Template configuration

WebUI PortPorttcp

Host port for dashboard + API (container listens internally on 8000). StockInfo has no login: never open this port on your router; use it in your home network or via VPN.

Target
8000
Default
8000
Value
8000
Data (Cache DB)Pathrw

Persistent path for the SQLite cache DB (survives container updates).

Target
/data
Default
/mnt/user/appdata/stockinfo
Value
/mnt/user/appdata/stockinfo
Refresh interval (hours)Variable

Interval of the periodic background refresh of all instruments.

Target
REFRESH_INTERVAL_HOURS
Default
6
Value
6
Cache TTL (hours)Variable

Age at which a quote is re-fetched on request.

Target
CACHE_TTL_HOURS
Default
6
Value
6
Metadata TTL (days)Variable

Refresh cycle for ETF metadata (TER, provider …).

Target
METADATA_TTL_DAYS
Default
7
Value
7
Default exchange (MIC)Variable

Preferred exchange (MIC) for ISIN lookups — worldwide. Examples: XETR (Xetra/EUR), XNAS (Nasdaq/USD), XNYS (NYSE/USD), XTSE (Toronto/CAD), XLON (London/GBp), XTKS (Tokyo/JPY), XASX (Sydney/AUD). The quote currency follows from the chosen exchange.

Target
DEFAULT_EXCHANGE
Default
XETR
Value
XETR
Strict exchangeVariable

If true, only the Default exchange is used — no Yahoo fallback. An ISIN with no listing there returns 404 instead of a substitute exchange/currency. Recommended for non-EUR instances that want honest &quot;not available&quot; over a wrong currency.

Target
STRICT_EXCHANGE
Default
false
Value
false
FX rate TTL (hours)Variable

Age at which a foreign-exchange rate (GET /fx, used to convert mixed-currency portfolios) is re-fetched. FX moves continuously — keep this short.

Target
FX_TTL_HOURS
Default
1
Value
1
OpenFIGI API keyVariable

Optional key for a higher OpenFIGI rate limit (empty = without).

Target
OPENFIGI_API_KEY
TimezoneVariable

Container timezone for log timestamps. Default UTC — set your local zone, e.g. Europe/Vienna or America/New_York.

Target
TZ
Default
UTC
Value
UTC