v0.2.0 — Interactive chart & server-rendered landing page
Landing page rebuilt around a single interactive, multi-range price chart and served directly
from FastAPI with server-rendered live data, replacing the earlier React portfolio-tracker
prototype.
Added
web/index.html— self-contained landing page built around a single interactive price chart:
metal selector (gold/silver/platinum/palladium), preset and custom date ranges, a USD/₹ unit
toggle, permanent x/y axis labels with gridlines, and a speech-bubble-style hover readout showing
the price and date for any point on the line.api.py—/api/metals,/api/prices/{metal},/api/fx/{currency}, and/api/widget/{metal}
HTTP endpoints serving data from the SQLite store.GET /api/prices/{metal}acceptsstart/enddate-range params (uncapped) alongside the capped
dayswindow, powering the landing page's full-history range picker (1W through ALL).GET /api/fx/{currency}— daily FX rate history (uncappedstart/end), so the site can convert
the full price history to INR using each day's actual rate instead of one approximated rate.GET /is now a proper FastAPI route (Jinja2,api.py's_latest_meta) instead of a static file:
the hero ingot's price, batch date, "last update" date, and the trust-strip's day count are
computed straight from the database at request time, so the page never carries a placeholder
value for them.web/assets/style.css,web/assets/script.js,web/assets/hero-preview.png— the page's CSS,
JS, and hero screenshot, previously inlined intoindex.html(including as base64 data URIs for
fonts and the hero image), extracted into their own linked files. Cutindex.htmlfrom ~210KB to
~44KB.render.yamlfor deploying the API to Render.
Changed
- Locked
/api/metals,/api/prices, and/api/fxto same-origin requests. - INR prices now use the real daily USD→INR rate for each date, instead of a single rate derived
from the latest day and applied across the whole history. index.htmlnow declares a proper<!DOCTYPE html>/<html>/<head>/<body>document structure
with a charset and viewport meta tag, instead of a bare fragment with neither — the missing
viewport tag meant mobile browsers were rendering the page at desktop width and scaling it down.
Removed
frontend/— the React + Vite portfolio tracking tool (buy/sell logging, CSV import/export against
spot price) and its built outputweb/portfolio/, along with the inline modal used to open it from
the landing page and theGET /api/prices/{metal}/on/{on_date}endpoint that only existed to
support it. Simplifies the product surface for the current go-to-market plan.
Fixed
- Added
UNIQUEconstraints on schema tables and reusedinit_dbin tests to prevent duplicate rows.