Repository navigation
v0.9.0
Hyperliquid joins the providers, the server now records BTC and ETH at all times, charts can use any interval built from a lower timeframe (live included), Pine scripts can import TradingView libraries, and a new /compare page diffs Pine scripts. Stooq is gone as a data source.
Breaking
- Stooq is no longer a data source. Its CSV download now sits behind a browser challenge a server cannot answer, so it had stopped returning data. Yahoo Finance and CSV import cover the same assets, and CSV import still reads Stooq's own CSV export format. What happens to saved data that names Stooq:
- Charts: a chart last left on Stooq opens on the default market (Binance BTCUSDT 1h) instead.
- Watchlists: Stooq entries are removed from your saved watchlists the first time the new version opens, and the cleaned lists are saved. A section left empty only by that is removed (a list keeps at least one section). They do not come back after a downgrade, so note the symbols first if you want to re-add them from Yahoo (for example
aapl.uson Stooq isAAPLon Yahoo). - Alerts: Stooq alerts stay in
alerts.jsonand stay listed as active, but they are never checked and never fire. The server logs[alerts] stooq <SYMBOL> stooq is no longer offeredonce per alert at start. Delete them in the Alerts panel and recreate them on Yahoo. - API:
/api/history,/api/symbolsand/api/searchwithprovider=stooqanswer400 Unknown provider "stooq",/api/liverefuses it, and/api/providersno longer lists it. - Config: no variable is dead.
VOST_ALERT_POLLstill applies, now only to Yahoo alerts (every other provider's alerts use the live stream). Astooq:entry inVOST_RECORDis skipped with a[recorder]warning. An outbound firewall rule forstooq.comcan be removed.
Highlights
- Hyperliquid Perps and Hyperliquid Spot: two new providers with chart history, symbol search, live candles and alerts, all fetched by the server. Symbols resolve in any letter case (
kpepeiskPEPE,hype/usdcis spot@107). Hyperliquid serves at most its latest 5000 bars per timeframe. - Recorded markets (
VOST_RECORD): the server now keeps a list of markets recorded at all times into the candle store added in v0.8.0. By default that is BTC and ETH on Binance, Coinbase and Hyperliquid Perps, on every timeframe, kept back to 20000 bars. Charts of a recorded market load from disk and ask the exchange only for what is missing. See the upgrade notes: this is on by default. - Any interval: the server accepts any number-and-unit timeframe (
2h,10m,3d,2w,3M) on/api/historyand/api/liveand builds it from the provider's best lower native timeframe. A non-canonical spelling (120m) answers 400 naming the canonical one (2h). - Built timeframes in the picker: timeframes a provider lacks are built from a lower one and offered, marked
*: Coinbase 30m, 4h, 1w and 1M, Kraken 1M and Yahoo 4h. - Build setting: a Build toggle next to the timeframe picker (in the More menu on narrower screens), off by default, builds every timeframe above the provider's lowest from the next lower native one, for history and live. Built stock daily bars can differ slightly from the exchange's official ones, and OKX's own daily bars use UTC+8 days while built ones use UTC.
- Live on built timeframes: Live now works on built timeframes; the server folds the lower timeframe's live feed into the higher bar and shares the exchange socket with any chart open on that lower timeframe.
- Yahoo full history: Yahoo 1d, 1w and 1M charts asked for all history used to come back as quarterly or monthly bars. The server now asks by date window, and refuses a reply whose bar size differs from the one asked for instead of drawing it.
- Pine libraries: a Pine script that does
import user/name/version as xnow runs. The server looks the library up on TradingView (open-source libraries only) and keeps a copy. A library that cannot be fetched fails the run with a message naming it, and the new Libraries button in the Pine pane lets you paste its source once. - Pine compare page:
/compareputs 2 to 4 Pine scripts side by side and marks what was added, changed or removed against a chosen reference. The Pine editor head has a Compare link. The page loads no market data and runs no Pine code. - One live stream per tab: all live charts in a tab now share one connection to the server, so a grid of up to 16 live charts no longer runs into the browser's six-connection limit.
- Under the hood: the client state is split into an app store and a per-chart store (groundwork for several charts), and
docs/spikes/pine-coverage/maps which Pine v6 features Vost runs and shows, with a probe that can be re-run.
Upgrade notes
- Recording is on by default. Leaving
VOST_RECORDunset or empty (asdocker-compose.ymlpasses it) records the default list:binance:BTCUSDT binance:ETHUSDT coinbase:BTC-USD coinbase:ETH-USD hyperliquid-perps:BTC hyperliquid-perps:ETH, every timeframe each provider streams live. SetVOST_RECORD=offto record nothing, or give your own list: entries separated by commas or spaces, eachprovider:SYMBOLorprovider:SYMBOL:tf/tf(for examplebinance:BTCUSDT:1h/1d).VOST_RECORD_BARS(default 20000, minimum 100) sets the depth kept per series. Both are read once at start. A bad entry is skipped with a[recorder]warning.- Network: the server holds one live connection per recorded series for as long as it runs, about 45 with the default list. The first start fills every series back to the depth, one request at a time per exchange (Binance and Coinbase 250 ms apart, Hyperliquid 1 s): a few thousand requests over up to about ten minutes. Charts keep working meanwhile. Later restarts fetch only the bars missed since. On HTTP 429 or 418 an exchange's fill backs off from 60 s up to 15 minutes.
- Disk:
candles.sqliteinVOST_DATA_DIRgrows to the order of 50 MB with the default list (about 90 bytes a row). A shorterVOST_RECORD_BARSshrinks it in proportion. A market taken off the list keeps its rows until you stop the server and deletecandles.sqlitewith its-waland-shmsiblings, which is safe: it is a cache and is rebuilt. - Watching it: the start log prints
[recorder] on: N series (...), each fill logs one[recorder] ... filledline, andGET /api/statusgains arecordersection with per-series state, newest bar, missing bars and last error.
- Outbound hosts. An outbound firewall must now also allow:
api.hyperliquid.xyzon port 443, for HTTPS (https://api.hyperliquid.xyz/info) and the websocket (wss://api.hyperliquid.xyz/ws). With the defaultVOST_RECORDthe server uses it from start, whether or not anyone opens a Hyperliquid chart.www.tradingview.comandpine-facade.tradingview.com(port 443), only when a Pine script imports a library the server has not stored yet. These are TradingView's unofficial web endpoints and may change; pasting the library is the fallback.- The recorder's default list also keeps the Binance (
stream.binance.com:9443, fallbackdata-stream.binance.vision) and Coinbase (ws-feed.exchange.coinbase.com) websockets open at all times, where before they opened only for a live chart or an alert.
- Pine libraries at runtime. The browser never calls TradingView; it asks the Vost server, which fetches a library the first time it is imported and saves it in a new file,
pine-libraries.json, inVOST_DATA_DIR. A stored copy never expires, so scripts keep running when TradingView is down. A not-found or closed-source answer is remembered for 10 minutes; a network failure is not remembered. A pasted library is stored the same way. Back uppine-libraries.jsonalong withalerts.jsonif you paste libraries. If the data folder is read-only, libraries are still fetched and served but not kept, and pasting answers 503. /api/live?sub=. The client now opens oneGET /api/live?sub=<key>&sub=<key>...stream per tab (up to 16 keys; a key isprovider:timeframe:source:symbol, and every event carries itssub). The old?provider=&symbol=&timeframe=form is still served unchanged, with untagged events. No reverse-proxy change is needed: thelocation /api/liveblock indocs/DEPLOYMENT.md(proxy_buffering off, a longproxy_read_timeout) matches the new form too. When the set of live charts changes the client opens the new stream before it closes the old one, so expect two/api/liveconnections from a tab for a moment./compareis a client route. Behind the Node server or the documented proxy it works as is. On static-only hosting the host must fall back toindex.htmlfor/compare.- API additions:
/api/historyand/api/livetake an optionalsource(nativeorbuilt; anything else is a 400) and any canonical interval;/api/providerslistshyperliquid-perpsandhyperliquid-spot;/api/statusgainsrecorderand has 23 checks (Hyperliquid added, Stooq removed, every provider now has a symbol-lookup check); newGET /api/pine/librariesandGET/PUT/DELETE /api/pine/libraries/<user>/<name>/<version>(writes are same-origin only, like the alert writes). Removed:provider=stooq. - Saved browser data: no migration. The store split (#176) keeps
vost.prefs.v1in its exact flat shape and keys, so the active chart, layout and settings restore as before, and a downgrade still reads them. New keys:buildTimeframesinvost.prefs.v1(the Build setting, off when absent) andvost.compare.v1(the compare page's panes). The one change to saved data is the removal of Stooq watchlist entries described under Breaking.
To deploy, build from the tag (git checkout v0.9.0, then docker compose up -d --build); no registry image of the app is published. Set VOST_RECORD=off in your environment or .env first if you do not want the recorder.
Changes
- Serve any minute, hour, day, week or month interval, built from the best lower native timeframe (#180)
- Run Pine scripts that import TradingView libraries (#177)
- Split the app store into an app store and a chart store per chart (#176)
- Share one live event stream per tab via /api/live?sub= (#174)
- Add a Pine v6 coverage map with a rerunnable probe (#175)
- Add a Pine compare page at /compare (#166)
- Add the Build setting: build higher timeframes from lower ones, for history and live (#167)
- Drop Stooq as a data source (#165)
- Stream Live on built timeframes: fold the base feed into the higher bar (#164)
- Yahoo: ask for full history by date window and refuse coarsened bars (#163)
- Record chosen markets at all times (VOST_RECORD), paced and trimmed (#158)
- Offer built timeframes: Coinbase 30m/4h/1w/1M, Kraken 1M, Yahoo 4h (#162)
- Add Hyperliquid Perps and Hyperliquid Spot providers (#161)