Data Manager
The tool window that shows what the history store holds — one shared catalog view mounted by both the desktop app and the Studio, and the sub-tabs around it.
Data Manager is the desktop app's window onto data: which symbols you care about, which live
feeds are cached, where history comes from, and — on its Stored tab — what the
history store actually holds on disk. The Stored tab is the part
with a crate of its own, vike-data-manager, and that crate is the authority for this section:
crates/vike-data-manager/src/lib.rs's header describes it as the cached-series catalog,
extracted from the app so that the Studio can mount the identical view and so that it runs in
CI at all — it uses egui and no wgpu, the same arrangement that lets the chart and Studio crates
be tested on GPU-less runners.
The window
The window body is crates/vike-app-core/src/tool_views/data.rs's data_tool_content: the
Symbols (DataSet) editor, the Cached-Series catalog of live feeds, the provider sub-tabs, and the
Stored sub-tab, which hands off to stored_tool_content. Its TABS array names seven sub-tabs
in this order — Symbols, Cached Series, Historical Providers, Event Providers,
Streaming Providers, Stored, and the per-venue arming tab Venues. The order is
load-bearing: ToolView::data_subtab is a bare index that two constants name by number —
crates/vike-app-core/src/startup.rs's DATA_SUBTAB_STORED for Stored and
crates/vike-app-core/src/tool_views/data.rs's DATA_SUBTAB_VENUES for Venues — so a new tab is
appended and never inserted; data_tool_content debug_asserts that DATA_SUBTAB_STORED still
points at "Stored", so a reordering trips a test rather than silently selecting the wrong pane.
Nothing persists the index: workspace::persist's capture saves chart windows only, and tool
windows are deliberately skipped as launcher-recreatable runtime state. The Venues tab is the last
one, and data_tab_reads_arming is how the shell knows whether this frame needs the
credential-store read and settings load that tab alone requires — see
Arm one venue for what the arming rows mean.
Symbols edits DataSets: crates/vike-data/src/datasets.rs's header defines a DataSet as a
named symbol collection bundling symbols with a default provider, interval and benchmark, so the
Data Manager can edit or test a whole universe at once. They persist to storage/datasets.json
and are seeded with Crypto Majors and FX Majors on first run. The symbols box takes free text:
parse_symbols splits on commas, semicolons, whitespace and newlines, upper-cases, de-duplicates
and keeps order. The "Ask the AI" box is suggest_symbols — its doc calls it a deterministic local
suggester that parses a count and an asset class out of the prompt and answers from a built-in
universe, an honest stand-in rather than a model call.
The Stored tab
Two modules split the work. crates/vike-data-manager/src/model.rs is pure: it groups the flat
inventory a HistStore reports — DataFusionHist::inventory is list_series plus one
series_coverage per series, computed from the manifest file-index with no DataFusion scan,
bytes being the summed on-disk size of the part files — into a venue → symbol → (kind, interval)
tree with per-node rollups. Nothing in it does I/O; the caller fetches the inventory off-thread
and hands it over. crates/vike-data-manager/src/view.rs renders that
tree as the grid described on The catalog, with the span
bars, gap cut-outs and partial-day flags described on Coverage.
The view is deliberately not coupled to the app's tool-view state or live feeds. It takes a slice
of venue nodes and a query string and returns a plain StoredSelection — venue, symbol, kind,
interval — and the caller decides what a click means. That is what lets it be mounted twice:
- The app's Stored tab (
crates/vike-app-core/src/tool_views/stored.rs'sstored_tool_content) mounts the richstored_catalog_gridwith its views sidebar, and wraps it in the controls the shared crate excludes: a Refresh button, a rows-and-bytes totals summary, and a confirm-gated Delete. A click opens a chart. The store I/O — the background load, the deletes, the chart open — happens in the app, never in the view. - The Studio's Data pane (
crates/vike-studio/src/data_browser.rs'sDataBrowserPane) mounts the plainstored_catalog_uias a picker: clicking a bar-series row selects it as the run slice, and a tick-series row, which carries no interval, selects nothing. See Data and slices.
Loading is never per-frame. crates/vike-desktop/src/app_methods.rs's refresh_stored runs on the
tab's first render, on every Refresh click and after a delete; a failed open or inventory scan
degrades to an empty tree rather than a "Loading…" that never ends. Which store it reads — the
local one, or a remote data service — is decided by the same resolved address that routes a
backfill, which is the subject of Backfill from the GUI.
The Polymarket proxy box lives here
The Stored tab also carries polymarket_proxy_ui: a label, one line, and Save. Its doc states the
two constraints the help line prints to the operator — SOCKS5 only, because
vike_bridge_core::ws_proxy::WsProxy::parse refuses every other scheme, and socks5h:// rather
than socks5://, because plain socks5 resolves DNS locally, which is exactly what a DNS-based
geo-block catches. An emptied box stores the sentinel none (PROXY_DIRECT) rather than nothing,
because the resolver's built-in default is proxy-on at a localhost tunnel, and writing nothing
would leave a user who is not geo-blocked dialling a tunnel that does not exist. The value is shown
plainly, embedded credentials included; the app performs the POLY_SOCKS_PROXY write, since only a
binary may touch the credential store, and the change takes effect after a restart.
Where the rest is
- The catalog — the grid: columns, sorting, search, selection and the bulk bar.
- Coverage — the span bar, gap cut-outs, the stale tint, partial days and the smart views.
- Backfill from the GUI — what the Backfill button plans, and where it runs.
- The history store and the data kinds it lays out; Data providers for what fills them.
Remote runs
The Backend toggle sends a Run, Sweep or Walk-Forward to a vike-datahub server over TCP and folds the answer into the same results pane, with the one refusal the split-plane rule adds.
The catalog
The stored-series grid — one rollup row per venue, one row per series, six sortable columns, a search box, and in the app a checkbox column with a bulk-action bar.