Fonrex Version Changelog
Next release
Prices
closeis the traded close again, adjusted for splits only;adj_closeis adjusted for splits and dividends. Before, both held the dividend-adjusted price.- One adjustment per series. A split or a dividend after the last ingestion used to leave a false return where the stored and the new bars met (about minus the dividend yield, -75 % after a 4-for-1 split). The ingestion now compares the last stored bars with the source and fetches the whole series again when they differ. Migration 016 adds
price_series_adjustments; series stored before are fetched again at their next ingestion (scripts/ingest_all.py --forcefor all at once). isinparameter onGET /eod/{ticker},GET /ticker/{symbol}/historyandPOST /historical/ingest: names the instrument when several share a ticker. The answers give thelistingthey read.
October 2026 — Secure defaults, per-listing prices, verified provider data
Merged on main on 8 October 2026 (pull request #15).
⚠️ Breaking changes
- An API key is required by default. Every route except
/health, the documentation,/widgets.json,/apps.jsonand/staticanswers401untilFONREX_API_KEYis set.FONREX_AUTH_REQUIRED=falseonly opens an instance with no key configured. New read-only keys (FONREX_READ_ONLY_API_KEYS) for clients outside the machine. GET /quoteandGET /openbb/quoteno longer start a realtime stream. UsePOST /realtime/subscribe;subscribe_if_missing=trueremains on/quotefor full-access keys.- Prices are stored per listing (migration 014):
prices_eodis keyed by(asset_listing_id, resolution, time)and dated by trading session. The migration converts existing rows; back up before upgrading. - Dividend yields are ratios everywhere, including stored values (migration 015).
Security and operations
- Docker Compose loads
.envand overrides the service addresses; PostgreSQL and Redis published on127.0.0.1only; database volume mounted on the right data directory. - Usage log written in background batches, without the caller's IP by default (
USAGE_LOG_IP), purged afterUSAGE_LOG_RETENTION_DAYS. POST /database/cleanupbounded (days_to_keep≥ 30) with adry_run.- Redis cache entries are JSON only.
Data quality
- Prices and fundamentals of a listing are fetched with a Yahoo symbol verified from the ISIN and the currency of the listing; a listing without one is not ingested, and the answer says why.
- Providers read the figures their pages really display (
financials/numbers.py); percentages are normalised before validation; an answer about another ISIN is rejected. /fundamentalbuilds each figure from Yahoo, then the stored figures, then the scraped providers, and names the source in aSourcessection.- Financial statements are read by fiscal year (DCF, solvency ratios).
- Every request parameter is part of its cache key (fundamentals, news, insider transactions, technical indicators per listing).
- The stored risk-free rate is refreshed from FRED; each realtime tick reaches each WebSocket client once.
- Migration 014 waits for running TimescaleDB jobs instead of deadlocking with them.
Quality
- Locked, hash-checked dependencies; a coverage floor per module (global 70 %); database tests on TimescaleDB in the CI; guards keeping
ARCHITECTURE.mdandAGENTS.mdin step with the code.
v1.6.0 (2026-09)
Major Features
- OpenBB Workspace Integration: Native backend adapter router (
/openbb) supporting 19 interactive widgets and 2 pre-assembled application dashboards (Fonrex — EU Markets&Fonrex — Screener & Macro). - Dual Header Authentication: Added support for OpenBB's native
X-API-KEYcustom header alongside standardAuthorization: Bearertoken validation (auth/dependencies.py). - Plotly & AgGrid Adapters: Standardized data transformations for Plotly figures (candlestick charts, technical indicator overlays) and AgGrid tables (deep fundamentals, DCF sensitivity matrix, news, index constituents).
🐛 Bug Fixes & Improvements
- Docker Volume Logging: Solved volume permission issues on host environments by ensuring
mkdir -p logssetup step and added permission troubleshooting guides. - DCF & Provider Updates: Improved caching and data normalization for DCF valuation models and index constituent providers.
v2.0.0 (2026-08)
Major Features
- Docusaurus v3 Documentation Suite: Complete technical documentation structure generated under
documentation/. - Provider Health Monitoring (Phase 12): Implemented
ValidationLayer,CanaryMonitor,provider_health_logTimescaleDB hypertable, daily consensus aggregation, and 7 REST health endpoints (/health/*). - Valuation & DCF Engine (Phase 11): Integrated FCF, EPS, and DDM intrinsic value models with dynamic WACC calculation and sensitivity matrices (
/dcf/*). - News Aggregator (Phase 10): Multi-provider scraping engine (
NewsService) across 7 sources withON CONFLICT (url)deduplication and Redis caching (/news/*). - ISIN Asset Architecture (Phase 9): Refactored asset database schema into
assets,asset_listings, andasset_mappingswith partial unique ISIN index.
🐛 Bug Fixes & Refactoring
- Legacy codebase cleanup (
eod/,record/,seed_assets.pypurged). - Standalone ISIN deduplication tool
scripts/clean_isin_duplicates.py. - Thread pool executor concurrency boundaries via
concurrency.py.