Repository navigation
Releases: cbundy/Vost
Release list
v0.15.1
A small release with no change to the app. It adds a research study to the repository: a sweep of the built-in strategy families over the top crypto, stocks and indices, looking for strategies that win 75% of trades at R:R 1 or 50% at R:R 4, with a hold-out check and a shuffled-returns baseline.
Highlights
- Under the hood: a new strategy search study in
docs/spikes/strategy-search/(the probe script, the symbol universe, the full results and a write-up of what survives on unseen data and against shuffled-return copies), linked fromdocs/STRATEGIES.md. Nothing in the app, the server or the build changed.
Upgrade notes
- Nothing to do. No change to the app, saved data, the API, the dependencies, Docker or deploy config. Upgrading from v0.15.0 and downgrading back are both safe.
To deploy, build from the tag (git checkout v0.15.1, then docker compose up -d --build); no registry image of the app is published.
Changes
- Strategy search spike: sweep top crypto, stocks and indices for 75%/R:R 1 and 50%/R:R 4 strategies, with hold-out and shuffled baseline (#414)
v0.15.0
Vost now keeps what you save on its server instead of in your browser: settings, layouts, drawings, watchlists, datasets, drawing pictures and the strategy maker's marks, form and model live in the server's data folder, follow you to any browser on the same server and survive clearing site data. What an older version kept in your browser is moved to the server once, the first time you open v0.15.0. The main chart gains Linear, Logarithmic, Percent and Indexed to 100 price scales and High and Low labels for the candles on screen, and the strategy maker loads up to 20,000 candles. Vost now needs its Node server to start, and the move changes what a downgrade does (see the upgrade notes).
Highlights
- Your data lives on the server: settings, layouts, drawings, watchlists and datasets are kept in the Vost server's data folder, so another browser or device on the same server sees them and clearing site data no longer removes them. If a save cannot reach the server, a message says so and Vost keeps trying; if the server cannot be reached at start, a page says so with a Retry button.
- One-time move from the browser: the first start of v0.15.0 moves what this browser kept to the server and the inbox says how many items moved. An item the server already holds is kept as the server has it, and the browser's copy is set aside in a file in the data folder.
- Drawing pictures on the server: pictures added with the Image tool are kept by the server, stored once however often they are used, follow the drawings to other browsers and are moved there from the browser once. A picture nothing uses is removed a day after it was last in use.
- Strategy maker data on the server: marked trades, the find form and the trained model are kept on the server and moved there once; the page says "Moved N sets from this browser to the server". Export and Import still work as before.
- Price scale modes: the main chart's price scale can be Linear, Logarithmic, Percent or Indexed to 100 from the right-click menu, with A (auto fit) and L (logarithmic) buttons when you hover the scale. Drawings, alerts and price lines stay at their prices in every mode, and the mode is remembered per chart and in layouts.
- High and low price labels: High and Low labels on the price scale show the highest and lowest price of the candles on screen as you scroll, zoom and live bars arrive. Turn them off in Settings.
- Strategy maker loads more candles: a market load brings up to 20,000 candles (fewer where the provider has less) and opens on the latest 300 or so bars.
- Under the hood: one request-body reader is shared by every server write route, a test scans the client so nothing but the one-time move touches local storage, and new capture scenarios cover the server store, the moves, price scales and high/low labels. The guide, README and deploy docs now say where everything is kept.
Upgrade notes
- One-time move of your browser data to the server. The first time each browser opens v0.15.0, it sends what it kept in local storage (every
vost.*key: preferences, the working layout and named layouts, drawings, watchlists, datasets, custom timeframes, the Pine compare page, the alert sound and seen state) toPOST /api/settings/import, and removes from the browser each key the server took or set aside. The inbox says "Moved N saved items from this browser to the server". The strategy maker's IndexedDB databasevost-strategy-makerand the picture storevost-imagesare moved the same way (the strategy maker on its own page, pictures at app start) and deleted from the browser once the server has confirmed everything. A failed move leaves the browser data in place and is tried again at the next start. - Open your main browser first. The server adopts only names it does not have yet and never overwrites one. The first browser to start v0.15.0 wins; when another browser later moves a different copy of the same item (for example its own preferences), the server keeps its copy and writes the browser's to
settings-imported-<ms>.json(orstrategy-maker-imported-<ms>.json) in the data folder, and the browser's copy is removed. Nothing is lost, but recovering it means editing that file by hand. - New folders in the data folder, no new variable.
VOST_DATA_DIR(default./data,/datain the Docker image) now also holdssettings/(one<name>.jsonper setting),images/(pictures named by their SHA-256, plusindex.json),strategy-maker/(sets,inputs.json,model.json) and any*-imported-<ms>.jsonarchives. They are created on first write. Back up the whole folder: it now holds all your work, not just alerts. - Keep
/dataon a persistent volume.docker-compose.ymlalready mounts the named volumevost-dataon/data, so Compose users need do nothing. With plaindocker run, add-v vost-data:/data(or a bind mount writable by the image'snodeuser); without it, re-creating the container now loses your settings, layouts, drawings and datasets, not just alerts. If the folder is not writable, Vost still starts and reads, but every save answers503namingVOST_DATA_DIRand the app shows a "not saved" message. - Raise a reverse proxy's request-size cap. Saves go through
/api/settings,/api/imagesand/api/strategy-makerwith bodies of up to 32 MB (5 MB per picture, 64 MB for the settings move, 128 MB for a strategy maker move or import). nginx refuses anything over 1 MB by default, and the app treats that413as a refused save it does not retry. Setclient_max_body_size 128m;(the example indocs/DEPLOYMENT.mdnow does) before the first start of v0.15.0. The new routes are same-origin only like/api/alerts, so the proxy must passHostthrough unchanged, as before. - Vost needs its Node server to start. The app loads everything from
/api/settingsat start, so servingclient/distalone (static hosting) is no longer supported: it shows "The Vost server cannot be reached". While saves are failing, leaving the page asks you to confirm. - New API endpoints:
/api/settings(GET,PUT,DELETE,POST /api/settings/import),/api/images(GET,PUT,POST /api/images/sweep) and/api/strategy-maker(sets, inputs, model,import,migrate); seedocs/DEPLOYMENT.md. No existing endpoint changed. - Preferences gain fields:
vost.prefs.v1(now theprefs.v1setting on the server) gainshighLowLabels(missing reads as on) andpriceScaleMode(linear,log,percentorindexed; missing or bad reads as linear), and each layout chart record gainspriceScaleModewhen it is not linear. High and low labels are on by default. - No Docker or dependency change.
Dockerfile(a comment only),docker-compose.ymland the dependencies are unchanged, and there is no new environment variable. The server starts with three more log lines naming the settings, pictures and strategy maker stores. - Downgrading to v0.14.x: v0.14.x reads only browser storage, and the move emptied it, so a downgraded browser starts with default settings and no layouts, drawings, watchlists, datasets, pictures or strategy maker sets. The server's
settings/,images/andstrategy-maker/folders are left untouched and v0.14.x ignores them; upgrading again brings everything back. Anything you change while on v0.14.x is kept in that browser and moved at the next upgrade, where the server's copy wins for items it already has (the browser's goes to an*-imported-<ms>.jsonfile). To keep working on v0.14.x, export watchlists and strategy maker sets on v0.15.0 first and import them there.
To deploy, build from the tag (git checkout v0.15.0, then docker compose up -d --build); no registry image of the app is published. Nothing in your .env needs to change; make sure the data folder is on a persistent, writable volume and that any reverse proxy allows large request bodies.
Changes
- Strategy maker loads up to 20,000 candles and opens on the latest 300 bars (#408)
- Keep drawing pictures on the server: /api/images store, server-side sweep, one-time move from the browser (#398) (#405)
- Keep the strategy maker's marks, find form and model on the server, with a one-time move from the browser (#404)
- Keep settings, layouts, drawings, watchlists and datasets on the server (#403)
- Price scale modes on the main chart: Linear, Logarithmic, Percent, Indexed to 100, with hover A/L buttons (#402)
- High and low price labels for the visible candles, with a Settings switch (#401)
- Server-side settings store and /api/settings, with a shared request-body reader (#400)
v0.14.0
A new, optional strategy maker page at /strategy-maker finds a built-in strategy from trades you mark with a brush: a small decision tree explains your trades, a search in a background worker ranks settings and validates them, and a result opens in the Backtest tab or copies as a Pine strategy. Indicators get legend rows on the chart and a settings dialog with Inputs, Style and Visibility tabs. Pine indicators with a timeframe argument get Calculation settings (lower timeframes included), a new setting stops higher-timeframe repainting, and editor changes stay a draft until Add to chart. The top bar gains Undo and Redo, a Chart data pop-up and a Live dot, a countdown shows the time to bar close, and backtests on Full data test the provider's whole history. Several behaviours change on upgrade (see the upgrade notes).
Highlights
- Strategy maker: the optional
/strategy-makerpage loads a market, a saved dataset or a CSV file on a chart of its own, apart from the main app (no live stream, no alert polling, and the main app never loads its code). - Mark trades with a brush: Brush long, Brush short and Eraser mark the trades you would have taken, with undo, redo, keys and a trade list. Marks are saved per chart in this browser.
- Find a strategy: from 30 or more marks, Find a strategy runs in a background worker with progress and Cancel, using your strategy type, allowed indicator families, risk and targets.
- Readable results: a decision tree writes your trades as plain rules with each family's importance, ranked settings show in-sample and held-out figures, the chosen one is checked by held-out, walk-forward, neighbour and Monte Carlo tests, and a found strategy's trades draw beside your marks.
- From strategy maker to backtest: Open in Backtest opens Vost with the Backtest tab set to the found strategy, its settings and risk; Copy settings and Copy as Pine strategy copy it as text or as a Pine v6
strategy()that takes the same trades. A Strategy maker link sits next to the Backtest tab's Strategy select. - Saved model, Sets, Export and Import: the trained model is kept and flagged when out of date, with Retrain, a Sets panel (Open, Rename, Delete) and an export file to move everything to another machine.
- Indicator legend rows: every indicator gets a row in the chart legend with its name, inputs and values at the crosshair, and hover buttons for Hide, Settings, Source code (Pine), Remove and a menu. A hidden indicator keeps a dimmed row.
- Indicator settings dialog: the gear opens Inputs, Style and Visibility tabs. Style sets each plot's colour, opacity, thickness, line style, plot type and price line, plus precision and what the status line shows; Visibility hides an indicator on chosen timeframe kinds; Defaults resets or saves your settings as the default for new indicators.
- Pine Calculation settings: a script that names
timeframeinindicator(...)gets a Calculation section with a Timeframe list and "Wait for timeframe closes", and can now run on a timeframe lower than the chart's. - No-repaint setting for Pine: Settings, Pine scripts, Higher timeframes on the live bar can pick Only finished bars (no repaint), so a script that declares a higher timeframe never changes its live bar later.
- Pine editor drafts: what you type stays a draft until Add to chart (or Ctrl/Cmd+Enter); the draft is saved with the indicator and survives a reload.
- Top bar Chart data pop-up and Live dot: the Chart data button holds the loaded range and bar count, the Build switch, the Number of bars menu and Load; Live is a coloured state dot (live, connecting, error, off).
- Top bar Undo and Redo: buttons for the active chart's drawings, greyed out when there is nothing to undo or redo.
- Countdown to bar close: a label under the last price counts down to the close of the forming bar; turn it off in Settings.
- Full data backtests test the whole history: a backtest or optimizer run with no From (Full data) first loads the provider's whole history for that market, up to 200,000 bars, in either chart history mode.
- Max DD duration in clock time: the Max DD duration card also shows the stretch in minutes, hours, days, weeks and years.
- Switching symbol keeps your view: switching symbol on the same timeframe keeps the dates and zoom you were looking at.
- A fresh chart opens on the Reset view window: a newly loaded chart opens on the window Reset view shows for its timeframe instead of fitting every loaded bar.
- Bottom dock starts collapsed: the dock opens collapsed below the chart; click a tab or the arrow to open it.
- How often data updates: the guide now has a table of each kind of data's rhythm, with each provider's live push rate in
docs/DATA-SOURCES.md. - Under the hood: the strategy maker's search engine is a library with its own tests, and a test pins the documented update rates. New capture scenarios cover the new features.
Upgrade notes
- A fresh chart no longer fits all data: a chart that loads (on start, a timeframe change or a dataset) opens on the Reset view window for its timeframe (the last day on minute charts, 5 days on hourly, a month on daily). Use the All quick range to see every loaded bar. A chart limited by the Range picker still shows its whole range.
- Switching symbol keeps the dates and zoom on the same timeframe instead of re-fitting the chart, and may page in older bars to fill the window.
- The bottom dock starts collapsed on every load: its open or collapsed state is not restored. Click a tab or the arrow to open it.
- Top bar controls moved: Load, the Build switch, the Number of bars menu (in Load all bars at once mode) and the loaded date range and bar count are now in the Chart data pop-up (the database icon). Live is a dot instead of a labelled button.
- Pine editor edits no longer run as you type: press Add to chart or Ctrl/Cmd+Enter. Backtests, the optimizer and Compare use the script on the chart, never an unapplied draft.
- Full data backtests now load the provider's whole history: a backtest or optimizer run with an empty From fetches all older history first (up to 200,000 bars), so it can take longer and makes more
/apihistory requests than v0.13.x, which tested only the loaded bars. Set a From to test a shorter window. A dataset, a chart range and replay run as before. - The bar-close countdown is on by default: turn it off with Countdown to bar close in Settings.
- A colour picked in the Style tab replaces per-bar colours (the MACD histogram, Volume, a Pine script's conditional colours); an opacity alone only fades them.
vost.prefs.v1gains fields:barCountdown(boolean; a missing or bad value reads as on),pineHigherBars(formingorfinished; a missing or bad value reads asforming) andindicatorDefaults(per built-in indicator kind:paramsandhideOn, plus a style; bad entries load as nothing). Each saved indicator may gainhideOn(timeframe kinds it is hidden on),style(per-plot style, precision and status-line choices), and for Pine scriptsdraft(unapplied editor text) andcalculation(timeframeandgaps). No key is renamed and no migration runs.- New IndexedDB database
vost-strategy-maker(version 2, storeshighlightSetsandsettings) holds the strategy maker's marks, its find form and its trained model. It is created only when you open/strategy-maker. Its Export writes avost-strategy-maker.jsonfile. Open in Backtest passes the strategy in the address after a#, which Vost reads once and removes; nothing is stored for it.- Downgrade: v0.13.x ignores the new prefs and indicator fields (it may drop them the next time it saves your settings, so indicator styles, visibility, defaults, Calculation overrides and unapplied Pine drafts are lost) and has no strategy maker page; the
vost-strategy-makerdatabase is left untouched.
- Downgrade: v0.13.x ignores the new prefs and indicator fields (it may drop them the next time it saves your settings, so indicator styles, visibility, defaults, Calculation overrides and unapplied Pine drafts are lost) and has no strategy maker page; the
- More requests to market providers, no new hosts: Full data backtests, Pine Calculation timeframes (lower timeframes ...
v0.13.1
A Pine script that asks for data Vost does not have (company financials, economic data, Pine Seeds, dividends, splits or earnings) now stops with a message naming the call, instead of running on and showing an empty plot. Errors from request.security_lower_tf now name that call.
Highlights
- Fix: Pine data calls Vost lacks stop the run:
request.financial,request.economic,request.seed,request.dividends,request.splitsandrequest.earningsstop the script with a plain message, such asrequest.earnings() is not available in Vost: it has no earnings data, wherever the call sits. Before, the script ran and showed an empty plot with only a warning.request.footprintandrequest.quandlare unchanged. - Fix:
request.security_lower_tferrors name the call: when the lower-timeframe bars cannot load (the 20000-bar cap, a failed fetch, a symbol not found), the message now starts withrequest.security_lower_tf(instead ofrequest.security(. - Under the hood:
request.security_lower_tfon the chart's own symbol is now pinned by tests (closes in time order per chart bar, nothing past the run end, an imported dataset refusing a lower timeframe), the engine pin check covers the six unavailable calls, and the Pine coverage map and probe output are updated.
Upgrade notes
- Scripts that call these six functions now stop: a script that calls
request.financial,economic,seed,dividends,splitsorearningsused to run with an empty value; it now fails with a message in the Pine pane, and a backtest or optimizer run of such a strategy fails the same way. Remove the call to run the script. - No other change. Saved browser data, the API, the server and deploy config are unchanged from 0.13.0, and no dependency changed (PineTS stays 0.13.0).
To deploy, build from the tag (git checkout v0.13.1, then docker compose up -d --build); no registry image of the app is published. Nothing in your environment or .env needs to change.
Changes
- Pine intrabar arrays pinned with tests and named in errors; six data calls Vost lacks stop the run (#345)
v0.13.0
Charts now open live on their own, on their latest 1000 bars, and page older history in as you scroll back; a backtest or optimizer run loads the older history its range needs. A new Settings popup (the gear in the top bar) brings back loading everything at once, and Reset view shows a window sized to the timeframe. Pine scripts run with the chart's real symbol, timeframe and market, and draw much more of what they ask for: fills, custom candles, bar colours, arrows, every plot style, and line, box, polyline, linefill, label and table objects. request.security reads other timeframes and other symbols (from the data source the prefix names), an indicator can declare its own timeframe, inputs get a control per type, and a Messages list shows alerts and logs. Six drawing tools join the Forecasting and Measurers sections, and indicator panes get legends. Several behaviours change on upgrade (see the upgrade notes).
Highlights
- Charts open live: every chart of a provider that streams opens live on its own, every chart of a layout included, and stays live through symbol, timeframe and provider changes. Turning Live off sticks for that chart until you turn it back on. Picking a chart range now pauses Live (with one notice) instead of being refused, and clearing the range goes live again.
- 1000 bars and scroll-back paging: a chart opens on its latest 1000 bars and loads older bars in pages of 1000 as you scroll or zoom back, until the provider's history starts (or 200000 bars). The quick ranges and Reset view page in what they need before they zoom.
- Backtests load the history they need: a backtest or optimizer run whose From lies before the loaded bars first loads the older history ("Loading history", with Cancel in the optimizer), tests the whole range and moves the chart to show it.
- Settings popup: the gear at the right end of the top bar opens Settings. Under Charts, Chart history picks Load as you scroll back (the default) or Load all bars at once, which brings back the Number of bars menu. The choice is saved and open charts reload at once.
- Reset view sized to the timeframe: Reset view shows the last day on minute charts, the last 5 days on hourly charts and the last month on daily charts; weekly and monthly charts still fit all the data.
- Indicator pane legends: each RSI, MACD and own-pane Pine script pane gets a legend with its name, parameters and each plot's value at the crosshair, scale labels for last values and levels, a modest default height, and a dragged height that survives adding, removing or editing indicators.
- Pine sees the real chart: a script runs with the chart's symbol, timeframe and market details (
syminfo.*,timeframe.*,math.round_to_mintick) on the chart, in the backtester and in the optimizer, instead of a fixedVOSTonD. - Pine
request.security: a script can read the chart's symbol at other timeframes, aligned so a backtest, the optimizer and replay never see the future, and other symbols, from the data source the prefix names (BYBIT:ETHUSDTon a Binance chart).request.security_lower_tfandrequest.currency_ratework too. An indicator that declares its owntimeframe=runs on that timeframe's bars and shows its values on the chart's bars. - Pine fills:
fill()shades the area between two plots or hlines, such as an RSI band or a moving-average cloud. - Pine custom candles, bar colours and arrows:
plotcandle,plotbar,barcolorandplotarroware drawn instead of dropped. - Pine plot styles: plots honour
linewidth,offset, step lines, areas,histbase,plotshapetext and size,plotcharcharacters and hline styles. A script withoverlay=falsedraws its shapes in its own pane, not on the candles. - Pine drawing objects: a script's line, box, polyline, linefill, label and table objects show on the chart, read-only, in the pane it draws in, with label and table-cell tooltips on hover.
- Pine inputs: every input type gets a fitting control (colour with opacity, source, date-time, timeframe, symbol, session, text area), laid out in the script's groups and inline rows with its tooltips, in the Pine and Backtest panes. Text inputs now reach backtests and every optimizer run.
- Pine alerts and logs: after a run the Pine pane's Messages section lists the
alert()calls that fired, thealertcondition()s that came true and thelog.*lines. They are listed only, not sent to Vost's alerts. - Forecast and Projection tools: Forecast draws a source-to-target line that turns Success or Failure once later bars arrive, and Projection measures a projection against a leg with an arc.
- Bars pattern and Ghost feed: Bars pattern copies a run of bars ahead (mirrored, flipped, as HL bars, OC bars or a line), and Ghost feed draws hand-placed future bars that look the same on every repaint.
- Range tools: Price range, Date range and Date and price range are saved, undoable measurers with change, percent, ticks, bars, elapsed time and volume.
- Under the hood: the Pine coverage probe now trips each of the six strategy risk rules (all honoured), drafts upstream PineTS bug reports in
docs/spikes/pine-coverage/upstream/, and a test fails when the installed PineTS version differs from the probe output's. API errors carry their HTTP status inside the client. New capture scenarios cover the new features.
Upgrade notes
- Charts open live by default: every chart of a provider that streams now opens a live stream on load, so a layout of several charts opens several streams (the server still shares one exchange connection per feed). The Live choice is not saved: after a reload every chart is live again. Picking a chart range pauses Live instead of refusing the range.
- History loads in pages by default, and the Bars menu is hidden: a chart now opens on its latest 1000 bars, whatever Number of bars you had saved, and the Number of bars menu is gone from the top bar and the More menu. To get the v0.12.0 behaviour back, pick Settings, Charts, Chart history, Load all bars at once; your saved bar count is kept and used again. Opening a chart fits its 1000 bars, so one older page usually loads right away.
- Backtests may load history and move the chart: a backtest or optimizer run whose From is before the loaded bars now fetches older history first and then moves the chart to show the range. A range inside the loaded bars, an empty From, Load all bars at once, a dataset, a chart range and a replay run as before.
- Reset view no longer always fits all data: on minute, hourly and daily charts it shows a window sized to the timeframe. Use the All quick range to see every loaded bar.
- Pine lines draw thinner: a
plotorhlinewith nolinewidthis now 1 pixel wide (Pine's default) instead of 2. Setlinewidth=2for the old look. A new indicator pane (RSI, MACD or an own-pane Pine script) opens at a smaller default height, and Pinelog.*lines go to the Messages list, not the browser console. vost.prefs.v1gains fields:historyLoading(scrollorall; a missing or bad value reads asscroll), and the saved backtest settingsbtConfiggain an optionalpineInputs(a Pine strategy's text, colour, source, timeframe, symbol and session inputs; old saves load without it). No key is renamed and no migration runs; saved drawings stayvost.drawings.v2, format version 2, and the drawing tools add new tool kinds to it.- Downgrade: v0.12.0 ignores
historyLoadingandpineInputs(it may drop them the next time it saves your settings, so a strategy's text inputs fall back to their defaults), and keeps drawings of the six new tools as stored without showing them.
- Downgrade: v0.12.0 ignores
- More requests to market providers, no new hosts: scroll-back paging, backtest history loads and Pine
request.securityat other timeframes and symbols and indicators with a declared timeframe make more/apihistory requests. A script that reads another symbol makes the server fetch from that symbol's provider (for example Bybit forBYBIT:ETHUSDTon a Binance chart), which may be a provider the deployment did not use before. Every reques...
v0.12.0
Vost's drawing toolset grows from lines and channels to most of TradingView's: a multi-line text editor and nine note tools, a table, pictures, icons, emojis and stickers, ten more Fibonacci tools, four pitchforks, the Gann tools, fifteen shapes and brushes, six chart patterns, five Elliott wave tools, three cycle tools, Long and Short positions, Anchored VWAP and two volume profiles. Managing drawings gets multi-select, an Object tree, a floating toolbar and three new rail switches (Lock all, Stay in drawing mode and a weak or strong Magnet). The optimizer gains Monte Carlo validation of its top results. Saved drawings keep their key and format; pictures go to a new browser store (see the upgrade notes).
Highlights
- Text and notes: typing a note opens a multi-line box that grows and wraps (Enter adds a line, Ctrl or Cmd+Enter saves), and the Text tab holds colour, size, bold, italic, alignment and wrapping. New Anchored text stays put on the pane through pan, zoom and timeframe changes.
- Note tools: Note, Anchored note, Callout, Comment, Price note, Price label, Signpost and Flag mark in the Annotations family.
- Table: a table drawing edited cell by cell, with rows and columns added and removed.
- Image: the Image tool places a PNG, JPEG, GIF or WebP picture (up to 5 MB) from a file chooser, a paste or a drop, resized with corner handles, with opacity, a border and Keep ratio. Pictures are kept in your browser, once each however often they are used.
- Icons, emojis and stickers: a new Icons family with a searchable picker (category tabs, Recent picks, keyboard control) over about 248 Lucide icons, 382 Twemoji emojis and 100 OpenMoji stickers, bundled with the app. Placed pictures move, resize about their centre and rotate (Shift snaps to 15 degrees).
- Fibonacci tools: ten more, the two-point tools Fib time zone, speed resistance fan, circles, spiral and speed resistance arcs, and the three-point tools trend-based extension, channel, trend-based time, wedge and pitchfan, each with its own level table.
- Gann tools: the Gann box, Gann square fixed, Gann square and Gann fan, with level, fan and arc tables.
- Pitchforks: Pitchfork, Schiff, Modified Schiff and Inside in the Lines family, with editable levels, fills and a Style switch between the four constructions.
- Shapes and brushes: Brush and Highlighter freehand strokes, and Circle, Arrow, Arrow marker, Arrow mark up and down, Path and Polyline (any number of points, up to 100), Rotated rectangle, Ellipse, Triangle, Arc, Curve and Double curve.
- Chart patterns: XABCD, Cypher, ABCD, Head and shoulders, Triangle pattern and Three drives, with their labels and ratios.
- Elliott waves: Impulse, Correction, Triangle, Double combo and Triple combo, with a Wave degree that sets the labels.
- Cycle tools: Cyclic lines, Time cycles and Sine line.
- Long and Short positions: one click places an entry, a target and a stop; the label works out quantity, risk/reward and profit or loss, a dashed path shows which of target or stop the later bars reached, and a new Inputs tab sets account size, lot size and risk.
- Anchored VWAP and volume profiles: Anchored VWAP with optional 1, 2 and 3 standard deviation bands, and the Fixed range and Anchored volume profiles with a point of control and value area, computed from the loaded bars and kept current on live bars.
- Select several drawings: Shift+click and a Shift+drag box select many drawings, which then move, clone, copy, paste, lock, reorder and delete together, each as one undo step.
- Object tree: a side panel list of the active chart's drawings to select, hide, lock, rename, reorder by drag and delete. The right-click menu gains Hide.
- Floating toolbar: a small toolbar over the selected drawing with quick colour, width and line style, Settings, Lock, Clone, Delete and a More menu.
- Magnet modes, Lock all and Stay in drawing mode: the rail offers a Weak magnet (snaps only within about 10 pixels of a bar's open, high, low or close) beside the Strong one, Lock all drawings, and Stay in drawing mode, all remembered across reloads.
- Optimizer Monte Carlo: a fifth Validation choice re-runs the top 1 to 50 results and runs the seeded Monte Carlo on each, listing return and drawdown percentiles and the chance of a loss per result, sortable, with nine
mc_*columns in the results CSV. - Under the hood: the dev-system tooling moves to 0.101.2, and a written feasibility study of a strategy maker with a seeded probe sits in
docs/spikes/strategy-maker/(no app change).
Upgrade notes
- No server, API, environment or deploy change. Every change is in the browser app. No new endpoint, variable, outbound host or proxy rule, and nothing in
Dockerfile,docker-compose.ymlor.dockerignorechanged. The icons, emojis and stickers are bundled; nothing is fetched from the internet. - Saved drawings keep their key and format: still
vost.drawings.v2, format version 2, no migration. New tools, and new optional fields (hidden,cellsfor the table,glyphfor icons,imagefor pictures), are added to the same format.- Downgrade: v0.11.0 keeps a drawing of a tool it does not know, or with a field it does not know, as stored and writes it back unchanged, but does not show it. So on v0.11.0 every drawing made with a new tool, and every drawing you hid, is not shown, and it comes back on upgrading again.
- New picture store in IndexedDB: the Image tool keeps pictures in a new IndexedDB database
vost-images(one record per picture, keyed by the SHA-256 of its bytes, at most 50 MB in all); a drawing holds only the key and size. A picture no drawing, undo step or copy uses is removed a day after it was last in use. Pictures are not part of the drawings in localStorage, so copyingvost.drawings.v2to another browser carries the drawing but not its picture (it shows "Picture missing"). In a browser without IndexedDB (some private modes) the Image tool is greyed out. vost.prefs.v1gains fields:drawingMagnetStrength,drawingsLocked,drawingStayMode,glyphArmedandglyphRecent(the last picks of each icon tool), andsidePanelmay now beobjects. Older prefs load with defaults and bad values are dropped. v0.11.0 ignores these fields and drops them the next time it saves your settings, and readssidePanel: objectsas the watchlist.- Magnet behaviour change: a magnet you had switched on in v0.11.0 (stored
drawingMagnet: truewith no strength) loads as the new Weak magnet, which snaps only near a bar's open, high, low or close. Pick Strong magnet from the chevron beside the Magnet button for the old always-snap behaviour. - Bundle size: the main script grows from about 1,999 kB to 2,163 kB (602 to 652 kB gzipped). The icon sets are three separate chunks, loaded only when their picker opens or a saved picture first draws: icons 62 kB, stickers 267 kB and emojis 542 kB (17, 64 and 176 kB gzipped).
- Export formats: with the new Monte Carlo validation the optimizer results CSV gains context lines and the columns
mc_status,mc_trades,mc_return_p5,mc_return_p50,mc_return_p95,mc_drawdown_p5,mc_drawdown_p50,mc_drawdown_p95andmc_prob_loss_pct. The CSV of the other validation choices is unchanged. - New keys and gestures on the chart: Shift+click and Shift+drag now select drawings (Shift+drag on empty chart draws a selection box instead of panning), and with the Image tool picked Ctrl or Cmd+V pastes a picture from the system clipboard when it holds one.
- Licences: the bundled icon art comes from Lucide (ISC), Twemoji (CC-BY 4.0) and OpenMoji (CC-BY-SA 4.0), credited in
docs/third-party-notices.md; the OpenMoji stickers stay under CC-BY-SA 4.0, separately from Vost's MIT licence. - Clearing site data for the Vost origin removes your dra...
v0.11.0
Vost now has a user guide, a much deeper optimizer (any number of parameters with Cancel, a full results table with CSV export, and three ways to check a result: in-sample / out-of-sample, walk-forward and robustness), a richer backtest Results tab (long vs short, streaks, exit reasons, Monte Carlo, a buy and hold line and a help tooltip on every figure) and a rebuilt drawing toolset: tool families with favourites, per-drawing styles and settings, lock, rename, ordering, clone and copy and paste, and ten new line and channel tools. Saved drawings move to a new format, carried over on first start (see the upgrade notes).
Highlights
- User guide:
docs/guide/describes every area of Vost, one page each, starting from Getting started: what you see, what you do and where it is saved. A test keeps its links, images and anchors working, and every release's highlights now link the page they change. - Pine indicator names: a Pine row in the Indicators list, its Edit button and the Pine pane selector now show the title written in the script (for example "EMA cross") instead of "Pine indicator", and follow the code as you edit it.
- Exact optimizer grid: the Optimizer now tests exactly the values you set (no silent cap of 60 values per parameter,
0.1to1.0step0.1gives exactly 10), names the parameters you swept in the table and heatmap, ranks an infinite profit factor first, refuses a fractional step on a whole-number parameter, and refuses a grid above 100,000 combinations instead of running it. - Sweep any number of parameters, with Cancel: add one row per parameter with Add parameter; the heatmap gets Rows and Columns pickers, and with three or more swept parameters it pins the others to the best result. Cancel beside the progress bar stops a run and brings back the result shown before it.
- Optimizer results table and CSV: every tested combination in a sortable table, 100 rows a page, with every measure and Apply, the heatmap below it. Export results CSV saves the whole run in ranking order with
#lines recording the run's settings. - In-sample / out-of-sample: a Validation choice searches the grid on the first part of the range (50 to 95%, default 70) and re-runs the top results on the held-out rest, side by side with their in-sample figures.
- Walk-forward: the range is cut into 2 to 20 windows, Rolling or Anchored; each window's winner runs on the stretch after it, and the held-out stretches are joined into one combined result with walk-forward efficiency and a joined equity chart.
- Robustness: scores each result by its grid neighbours (1 to 3 steps) without extra backtests, so a lucky one-off peak stands out from a broad, steady area. Four new sortable columns, an optional Rank by robustness, and the most robust heatmap cell outlined.
- Long vs short, streaks and exit reasons: the Results tab breaks the trades down by side, shows the longest win and loss streaks and the current one, and counts trades by exit reason (signal, stop loss, take profit, end of data).
- Monte Carlo: shuffle or resample the trades 100 to 10,000 times with a seed to see percentiles of final return and max drawdown, where the actual run falls, the chance of ending at a loss and a histogram. Export Monte Carlo CSV saves the figures.
- Buy and hold line: the equity chart draws a dashed Buy & hold line from the same capital, with a legend of both final values, and the equity CSV gains a
buy_holdcolumn. - Help on every figure: every figure in the Results tab (metric cards, breakdown rows, legend, Monte Carlo) has a tooltip on hover, focus or tap saying what it is, how to read it and what it relates to.
- Backtest progress bar: a progress bar with the stage and a percent replaces the spinner, under the Run button and in the Results tab.
- Compare shows only differences: on
/compareunchanged code folds into an "N unchanged lines" bar, a small change inside a line is shown in that line, an empty pane reads Empty, and typing in a long reference script no longer lags. - Drawing rail by family: one button per tool family (Cursors, Lines, Fibonacci and Gann, Forecasting and measurers, Shapes, Annotations) with pop-out lists, keyboard control and a star per tool; starred tools sit on a draggable favourites bar. New Dot and Arrow cursors and an Eraser.
- Drawing styles and settings: double-click a drawing to open its settings (colour, opacity, width, line style, extend, arrows, labels, Fibonacci levels, text style, coordinates and per-timeframe visibility). Edits preview live, OK is one undo step, and Save as default keeps a tool's style for new drawings.
- Managing drawings: right-click a drawing for Settings, Rename, Clone, Copy, Lock, Bring to front, Bring forward, Send backward, Send to back and Delete; right-click the empty chart for Paste and Remove drawings. Ctrl or Cmd+C and +V copy and paste, also onto another symbol's chart, and Ctrl or Cmd+drag clones.
- Line and channel tools: ten new tools in the Lines family: Info line, Extended line, Trend angle, Horizontal ray, Vertical line and Cross line, and the channels Parallel channel, Regression trend, Flat top/bottom and Disjoint channel. Selected lines label their price and time on the axes.
- Under the hood: each optimizer run gets its own worker (so Cancel never touches a backtest or Pine run), and
coredump files in the repo root are now ignored by git and left out of the Docker build context.
Upgrade notes
- No server, API, environment or deploy change. Every change in this release is in the browser app, apart from two new
.dockerignorelines (core,core.[0-9]*). No new endpoint, variable, outbound host or proxy rule. Optimizer, Monte Carlo and walk-forward runs all happen in your browser. - Saved drawings move to a new key, migrated on first start.
- New key
vost.drawings.v2(format version 2). When it is absent, the first start of v0.11.0 reads your drawings fromvost.drawings.v1and from then on saves only tovost.drawings.v2. The oldvost.drawings.v1key is never written or removed. - Version 2 adds per-drawing
style,nameandlockedfields and the new tools. A drawing of a tool this version does not know, or a field it does not know, is kept as stored and written back unchanged, but not shown. - Downgrade: v0.10.0 reads only
vost.drawings.v1, so it shows your drawings as they were when you first opened v0.11.0; anything drawn, moved, styled or deleted since is not seen there. Those changes stay invost.drawings.v2and come back if you upgrade again, but drawings you change while on v0.10.0 are not carried forward, because v0.11.0 reads v1 only while v2 is absent.
- New key
vost.prefs.v1gains fields:drawingDefaults(a tool's saved default style),drawingFavorites,drawingLastTool,cursorKindandfavoritesBarPos. Older prefs load with defaults, and bad values are dropped. v0.10.0 ignores these fields and drops them the next time it saves your settings.- Export formats changed (for anyone reading the files with a script): the equity CSV gains a
buy_holdcolumn afterposition. The optimizer CSV is new in this release; with a split, walk-forward or robustness validation it gains context lines and extra columns. - Optimizer behaviour: a grid above 100,000 combinations (or, for walk-forward,
windows x combinations + windowsbacktests) is now refused instead of being cut short, and a fractional step on a whole-number parameter is refused. The table and heatmap now show only the swept parameters. Optimizer settings are not saved in the browser, so nothing stored changes. - New chart keys: Ctrl or Cmd+C and Ctrl or Cmd+V copy and paste the selected drawing on the active chart, and the chart's right-click menu now lists Paste and Remove drawings after Add alert. The drawing clipboard lives only in the tab.
- Clearing site data for the Vost origin removes your drawings, both keys, along with the other browser settings.
To deploy, build from the tag (git checkout v0.11.0, then docker compose up -d --build); no registry image of the app is published. Nothing in your environment or .env needs to change.
Changes
v0.10.0
Vost now shows several charts at once: 1 to 16 charts in 55 arrangements, with one active chart that the top bar and panels follow, Sync in layout switches that carry symbol, interval, crosshair, time and date range across the charts, and named layouts you can save, autosave, copy, rename and reopen. The timeframe picker also takes any custom interval.
Highlights
- Chart layouts: the "Select layout" button at the left of the top bar opens 55 arrangements of 1 to 16 charts. Click a chart to make it active (it gets an accent outline); the top bar, dock, Pine pane and watchlist act on the active chart. Going to more charts copies the active chart's market, timeframe and bars into the new ones; going to fewer keeps the first ones and stops the rest. Drag the dividers to resize (double-click resets them to even). On narrow screens only the active chart shows, with a switcher ("2 / 4", previous, next and a menu by market and timeframe).
- Sync in layout: five switches in the layout picker (Symbol, Interval, Crosshair, Time, Date range). With one on, a change on one chart follows on every other chart. Crosshair is on by default, the rest off. A chart whose provider does not serve a synced interval keeps its own, with a toast naming it.
- Named layouts: the layout's name sits in the top bar (in the More menu on narrow screens) and opens a menu: Save layout (Ctrl+S or Cmd+S, which no longer opens the browser's save dialog), Autosave (on by default), Make a copy, Rename, Create new layout, up to 5 recently used layouts, and Open layout (also the
.key) with search and delete. With autosave off, a dot after the name marks unsaved changes and switching layouts asks Save, Don't save or Cancel. - Download chart data: from the layout menu, download the active chart's bars or every chart's as
<symbol>_<timeframe>.csvfiles. - Custom intervals: the timeframe picker ends with Add interval.... Enter a number and a unit (for example 2h, 10m, 3d, 2w or 3M); the dialog previews what it is built from and refuses an interval outside the limits, one already listed, or one the provider cannot serve or build. Up to 20 are kept, listed by bar length and marked
*, and hidden (not removed) on a provider that cannot serve them. The demo provider now generates any interval. Removing one moves every chart on it to the provider's default timeframe. - Drawings with several charts: charts share one drawings store per tab, so charts on the same market see each other's drawings and one chart's save no longer overwrites another's. Drawing shortcuts (Escape, undo, redo, Delete) act only on the active chart.
Upgrade notes
- No server, API, environment or deploy change. Every change in this release is in the browser app. Layouts, named layouts and custom intervals are stored only in the browser's localStorage, not on the server: they do not follow you to another browser or device, are not in
VOST_DATA_DIR, and are not covered by backing upalerts.json. No new endpoint, variable, outbound host or proxy rule. Sixteen live charts still share one/api/livestream per tab (added in v0.9.0). - Saved browser data: no migration, older data still loads.
- New key
vost.layout.v1: the working layout (arrangement, charts, divider sizes, active chart and the Sync flags), written on every change. On the first start of v0.10.0 it is absent, so you get one chart built from your existingvost.prefs.v1, exactly as before. If it is unreadable or does not match its arrangement, the app falls back the same way. A missing or badsyncfield takes the defaults. - New key
vost.savedLayouts.v1: the named layouts, each holding the same snapshot asvost.layout.v1, plus the Autosave flag. The first start, or a corrupt value, creates one layout named "Unnamed" from the working layout and changes no other key. vost.prefs.v1keeps its flat shape and is still written from the active chart. It gainscustomTimeframes(your custom intervals; empty when absent, and bad entries are dropped).vost.drawings.v1is unchanged in format.- Downgrade: v0.9.0 ignores the two new keys and opens one chart, the one that was active, from
vost.prefs.v1(on a custom interval it falls back to the provider's default timeframe). Your layouts stay in the browser and come back if you upgrade again.
- New key
- Clearing site data for the Vost origin removes your layouts and named layouts along with the other browser settings. Use Download chart data if you need the bars; layouts themselves have no export yet.
To deploy, build from the tag (git checkout v0.10.0, then docker compose up -d --build); no registry image of the app is published. Nothing in your environment or .env needs to change.
Changes
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...
v0.8.0
Coinbase charts now stream live, replay gains a Select bar button and keeps Pine output in step with play, and the server gets an on-disk candle store that later releases will fill.
Highlights
- Coinbase live candles: Coinbase charts now update live. Coinbase's public feed has no candle channel, so the server builds candles from its trade stream, starting each bar from Coinbase's own REST candle so a bar never looks smaller than the real one. Coinbase price alerts now use this live stream instead of polling every
VOST_ALERT_POLLseconds, and the connection light gains a Coinbase live-stream check. - Replay: Select bar: during a replay, Select bar goes back to choosing a start bar. Cancel resumes the replay where it was.
- Pine during replay: a Pine run that finishes after the replay has moved on is kept when it still holds for the visible bars, so a slow script's output follows play instead of blinking out.
- Symbol summary card: the card for the selected symbol is pinned to the bottom of the watchlist panel, so it stays in view while the list scrolls.
- Icon rail everywhere: the top-bar sidebar toggle is gone. The icon rail shows at every width; on narrow screens its buttons open the panel as a drawer.
- Candle store (groundwork): the server now keeps
candles.sqlitein the data folder and can answer/api/historyfrom it, fetching from the exchange only what it lacks. Nothing is recorded into it yet (the recorder is a later change), so charts still come from the exchanges exactly as before.
Upgrade notes
- New file in the data folder: on start the server creates
candles.sqlite(and its-waland-shmsiblings while running) inVOST_DATA_DIR, next toalerts.json. In Docker this is the existing/datavolume (vost-dataindocker-compose.yml): no new volume, mount or environment variable. Disk use stays at a few KB in this release, because nothing is recorded yet. The file is a cache and is safe to delete; back up onlyalerts.json. A corrupt file, or one of another schema version, is renamedcandles.sqlite.bad-<time>and a fresh one is made. If the folder cannot be written, the store turns off and the server runs as before. The startup log showscandle store: on (<path>)oroff. - Node: the store uses Node's built-in
node:sqlite, so no npm dependency is added. The Docker image (Node 24) needs nothing new. A bare-metal install still needs Node 22.18 or later (engines); Node 22 may print anExperimentalWarningfornode:sqliteat start, which is harmless. - Outbound access: the server now opens a websocket to
wss://ws-feed.exchange.coinbase.com(port 443) whenever a Coinbase chart is open live or a Coinbase alert is set, and the status checks probe it too. An outbound firewall that allowed onlyapi.exchange.coinbase.comfor Coinbase must also allowws-feed.exchange.coinbase.com. /api/statusgains an optionalcandles: { on, series, rows, bytes }field, and its check list grows from 17 to 18 (Coinbase live). Coinbase's catalog entry now reportssupportsLive: true. Both are additions; nothing was removed from the API.VOST_ALERT_POLLnow applies only to Yahoo and Stooq alerts.- Saved browser data is unchanged.
To deploy, build from the tag (git checkout v0.8.0, then docker compose up -d --build); no registry image of the app is published.
Changes
- Remove the sidebar toggle; the icon rail shows at every width and opens the drawer on narrow screens (#154)
- Add an on-disk candle store with read-through for recorded history (#153)
- Coinbase live: build candles from the public trade stream (#152)
- Alerts evaluator tests: wait for the firing instead of sleeping 10 ms (#151)
- Replay: Select bar button to pick a new start bar during replay (#139)
- Keep finished Pine runs that still hold during replay so output follows play (#140)
- Pin the symbol summary card to the bottom of the watchlist panel (#138)