BDOBBSecretoftheUniverse.com
Workspace compatibility

Your Workspace backend works here, unchanged.

BDOBB is a client for the contracts OpenBB Workspace publishes: widgets.json, apps.json and agents.json. Point it at a backend you already built for Workspace and its widgets, apps, parameter groups and agents arrive as they are. Nothing to rewrite, nothing to fork. What BDOBB adds sits on top.

Implemented in v10.0.0 Not yet Statuses reflect the v10.0.0 source.
Proof, not promises

Checked against OpenBB's own reference backend.

OpenBB (now OpenBQ) published a small reference backend that serves the widget types its Workspace spec documents. It is the spec's own implementation, so BDOBB tests against it rather than against its own reading of the spec. A conformance suite runs the app's code against the live backend, and fails, rather than skips, if the backend is missing.

71/71reference widgets rendered in the curated sweep
14tabs of OpenBB's Onboarding App for Devs, imported as one dashboard
3parameter groups preserved, read the way Workspace writes them
0reference widget types left on the "shown as raw JSON" list

The sweep included interactive PDF viewers, SQL Omni, Live Grid, Highcharts and Vega-Lite. That rehearsal did not cover hosted Workspace account sign-in or a restart of the packaged desktop app.

BDOBB showing OpenBB's Onboarding App for Devs from the reference backend: 14 tabs, three parameter groups, and the Types tab with metric, markdown, table, error-handling and news feed widgets The same Onboarding App for Devs in BDOBB, light theme
OpenBB's own Onboarding App for Devs, opened in BDOBB v8.1.2 from the reference backend's apps.json: all 14 tabs, its three parameter groups, and the first tab, Types. The HTTP 500 card is the reference backend's own error-handling example.
Widget types

Every type Workspace documents but one.

Each widget is drawn in its own card, never as a blank one. A type BDOBB doesn't recognise falls back to a readable Raw view.

tableTables with sort, filters, column order, widths and pins saved per cardRenders
chartPlotly figures drawn exactly as they arriveRenders
chart-highchartsTranslated into Plotly: line, area, bar, column and scatterRenders
chart-vegaliteTranslated into Plotly, with the same common marksRenders
markdownRendered markdownRenders
metricMetric tilesRenders
noteNotes saved with the cardRenders
multi_file_viewerDocuments, including interactive PDF viewersRenders
live_gridStreams over wsEndpoint, rows merged in place by identity column, with changed cells flashingRenders
newsfeedThe news feedRenders
youtubeYouTube embedsRenders
iframeFramed pages, with Workspace's iframe messagesRenders
advanced_chartingThe reference backend's TradingView chart: daily candles on lightweight-chartsRenders
html · omniSandboxed HTML, and the Omni prompt widget. The backend decides which code languages runRenders
table_ssrmServer-side tables. The card says so plainly instead of guessingNot yet
Feature by feature

What Workspace defines, and what BDOBB does with it.

Backends and discovery

  • widgets.json discovery. Add a backend by URL; its widgets join the library under their category and subCategory.
  • Several backends at once. Each is tracked on its own, so one going offline only affects its own cards.
  • Credentials where your backend expects them. In a header, a query parameter or a cookie, or asked for at each launch.
  • Validation you control. Malformed entries are reported as skipped; or switch validation off and take the payload as it comes.

widgets.json fields

  • name, description, endpoint, type, gridData. Read as Workspace reads them; new cards start at the declared size.
  • runButton. Run replaces Refresh; edits mark the card stale until you run it, and ⌘-click re-runs the last request.
  • refetchInterval. Milliseconds win over the app-wide setting, with a one-second floor; false turns polling off.
  • storage.mcpUrl. A widget's MCP server joins the agent's tools.
  • wsEndpoint. Live Grid streaming.

Parameters

  • Every documented type. date, text, ticker, number, boolean, endpoint, form and tabs.
  • Cascading options. optionsEndpoint with optionsParams refills live; multiSelect sends a,b.
  • $currentDate offsets resolved. $currentDate-1w is resolved, not sent verbatim, and {start, end} range defaults are read.
  • Hidden parameters still travel. show: false keeps a value off screen but on every request.
  • Parameter rows. Nested params rows are read; BDOBB lays them out as one wrapping line of chips.

Parameter groups and cell clicks

  • Workspace's own group shape. Groups import with apps and export in Workspace's format; a file that never used BDOBB's two extra fields round-trips byte for byte.
  • cellOnClick with groupBy. A click sets the group's parameter, with valueField and forceUpdate honoured.
  • sendToAgent. A cell click sends its row's markdown template to the agent.

Table columns (columnsDefs)

  • Layout. field, headerName, headerTooltip, prefix, suffix, width, minWidth, maxWidth, hide, and pinned left or right.
  • Types and formats. cellDataType picks the filter; formatterFn covers int, percent, normalized, normalizedPercent, dateToYear and none; decimalPlaces overrides.
  • Render functions. greenRed, titleCase, hoverCard, cellOnClick and showCellChange.
  • Colour rules and sparklines. All nine colorRules conditions with fill; sparkline cells as line, area or bar.

Charts

  • Plotly figures, untouched. A provider's figure keeps its own colours; scatter, candlestick, bar and heatmap traces draw.
  • Highcharts and Vega-Lite. Common cases are translated into the same Plotly, so they draw as chart cards, not raw JSON.
  • TradingView. Candles and volume on lightweight-charts, following the light or dark theme.
  • Raw, always. Every data card can switch to a Raw view of what the backend sent.

HTML and iframe messages

  • openbb-connect → openbb-auth. Credentials go only to a frame on the backend's own origin; any other origin gets an empty header map.
  • openbb-params-update. Sent on connect and on every parameter change.
  • openbb:widget-params:update. A framed page can set declared parameters, and grouped ones propagate.

Apps (apps.json)

  • Import. Every app becomes a dashboard, with tabs, layout and groups; a name clash asks before anything is written: Replace, Keep both or Skip.
  • Export in OpenBB's plain shape. A file that a backend can serve or Workspace can import.
  • Or the BDOBB-compatible profile. The same file plus table state, pivots and links, in a validated extension Workspace ignores.

Workspace account

  • Sign in to a Workspace server. Add it as a connection; Remember me keeps the username only, never the password or session token.
  • Display settings sync. Choose a server under User Settings and every save is uploaded.
  • Dashboards and apps sync both ways. A conflict asks Use server, Keep local or Keep both; shared dashboards arrive read-only.

Custom agents (agents.json)

  • The custom-agent contract. BDOBB reads /agents.json and streams answers from the query endpoint over SSE. Rita, OpenBB's open-source agent, plugs straight in.
  • Agent features. Capability flags show as badges. Toggles and text options are saved per agent and sent with every message in workspace_options, as a keyed object.
  • MCP servers. Add them in the AI Library. With context sharing on, servers named by a widget's storage.mcpUrl join from the open dashboard.
Try it with your own backend

Paste your widgets.json.

This checker runs in your browser, so nothing you paste is uploaded. It matches your widgets' types, parameter types and column render functions against the lists on this page. It is a guide, not the app's own validator.

Results appear here.

Honest edges

Not yet.

These Workspace features aren't implemented in v10.0.0. A widget that uses them still loads; the field is simply not acted on, or, for server-side tables, the card says it isn't supported.

  • table_ssrmServer-side row-model tables.
  • refetchInterval as cronUse a millisecond interval, the app-wide setting, or Refresh.
  • columnColorRead and ignored; the cell draws plainly.
  • chartDataTypeCharts are built from the data's own time and numeric columns.
  • raw re-requestThe Raw view shows the fetched payload rather than calling again with raw=true.
  • staleTime, dataUpdateDisplayNot read; refresh follows the interval rules above.
  • exportableNot read; CSV, JSON and Excel export are offered on data cards.
  • imgUrl, mcp_toolNot read.
  • Header credentials on a live grid's socketA browser websocket carries no header, so a live_grid backend that checks one on the handshake refuses the socket and the grid holds its snapshot. OpenBB's reference /live_grid_ws needs no auth and streams as usual; the web preview uses a gateway ticket.
Compatible first, then additive. Everything above is the shared contract. For what BDOBB layers on top, such as report-model pivots, calendar-aware dates, and pinned and locked widgets, see the comparison. See the comparison

Sources