Bedevere 0.15: what changed since June

Bedevere is our SQL data viewer for SAS, SPSS, Stata, Parquet, Excel, and CSV files. It runs DuckDB in your browser, so the file you open never leaves your machine. Since June it has had three releases: v0.13, v0.14, and v0.15, which shipped on 5 September with the desktop beta. Here is what changed, with two live demos you can edit. Every entry is in the changelog.

v0.14 gave Bedevere the same identity as this site. The default theme is now Paper: warm paper and ink, a booktabs result grid, duck yellow as the only accent. Embeds on kolistat.com read as part of the page instead of a widget dropped into it.

A theme is now a family plus a mode. The families are Paper, Tokyonight (the former Day and Storm classics), and Github. The modes are Light, Dark, and Auto. Both sit in Settings → Theme. If you had light, dark, or auto selected, you moved to Paper. A classic theme kept you on Tokyonight. The fonts ship with the app, so nothing is fetched at runtime and the desktop build works offline.

The .export command used to copy the current selection as CSV, TSV, HTML, or Markdown. Since v0.13 it also writes the whole table to a file:

Parquet and JSON come from DuckDB. The four statistical formats come from the-stats-duck, so they appear only when that extension is loaded. You get the whole table with its column types intact, and active filters and sorts are ignored. In the browser the file downloads. On the desktop a native Save dialog opens and DuckDB writes the file itself.

One caveat: the sas7bdat writer round-trips through ReadStat-family readers (this app, pyreadstat, haven), but real SAS will not open its output. Use .export xpt for files that have to go into SAS.

Since v0.13 the /embed route draws charts. A query ending in VISUALIZE … DRAW runs through the same pipeline as the main app. v0.15 fixed the two ways a chart used to fail silently on the web:

  • 64-bit integers. A BIGINT or HUGEINT column, which is what count(*) and range() produce, crashed the render. The chart pipeline now converts those values at the chart boundary. The spreadsheet keeps them exact.
  • Text columns on a categorical axis. the-stats-duck cannot see SQL column types, so a boxplot, violin, or bar over a text column drew nothing. The renderer now samples the data and retypes those channels. Anything you annotate by hand is left alone.

The bundled extension also moved to the-stats-duck v0.8. Here is the statement that drew nothing before v0.15, because species is text. Change boxplot to violin and run it again:

v0.15 closed three paths that lost work:

  1. Clicking the already-active saved query re-applied its stored text over your live edits, and autosave then persisted the revert.
  2. Edits made inside the autosave delay were lost when the tab closed. Pending autosaves now flush on beforeunload and pagehide.
  3. On the desktop, settings and saved queries were written to persistence.json but read back from localStorage. That was the "saved a query, got a different one back, then it vanished" report.

If a query seemed to vanish in desktop 0.14, upgrade and look again. It was in persistence.json all along.

table_one crashed on the web with TypeError: r is not a function. The bundled extension had been built with 64-bit integers split into pairs of 32-bit values, while DuckDB-WASM expects native ones, so an internal call hit a signature mismatch. v0.14 rebuilt the extension with the matching setting and pinned DuckDB-WASM to 1.32.0.

v0.15 also added a worked table_one example to the Help panel. Here is one by species, with p-values, on the Palmer penguins:

  • Embed parameters live in the URL fragment. The browser never sends the part after # to a server, so a prefilled query stays out of server logs and the Referer header.
  • One Content-Security-Policy per route. v0.15 moved the headers into a Worker, closing a route where the app could be framed. Embed datasets must also be https://.
  • Identifiers are quoted. A column or table name containing a " could break out of the generated SQL. This mattered most on the desktop, where the SQL runs against a native DuckDB.
  • The in-app feedback form is gone. Bug reports go through the contact page.

Bedevere Desktop runs the same interface on native DuckDB, in a self-contained Windows executable of about 75 MB, free during the beta. v0.14 wired the native file dialogs, so Open Folder uses the OS dialog and the bytes stay on your machine. The 0.15.0 beta shipped on 5 September for Windows 10 and 11.

@kolistat/bedevere-wise now has four entries: /ui (the components, no DuckDB-WASM), /duckdb (the WASM engine), /app (the shell, backend-agnostic, new in v0.14), and /ipc (the backend protocol over WebSocket, new in v0.13).

The one breaking change is in v0.14. The app shell no longer builds a default engine, so you pass one in.

DuckDB-WASM now loads lazily, so a host that brings its own engine never downloads the worker assets. The desktop renderer bundle went from 4.5 MB to 1.8 MB.

bedeverewise.app is free to use and the code is on GitHub. If a format, a chart, or a statistic you need is missing, get in touch.

Bring out your data.

添加评论
点赞收藏
点踩分享查看原文
评论
?
参与讨论