Datapane alternatives: what actually replaced one-line publishing

Datapane's pitch was "build and share data reports in 100% Python." You composed a report from DataFrames, Plotly figures, and markdown blocks, called dp.upload_report(), and got back a hosted URL your team could open and discuss. In August 2023, Datapane shut down. The hosted platform is gone and the open-source library is unmaintained.

Two and a half years later, the authoring half of that pitch has been replaced well — arguably better than Datapane ever did it. The publishing half hasn't. This page maps what to use for each.

The authoring half is solved

Quarto is the closest thing to a successor for "document with executable code." A .qmd file mixes markdown with Python, R, or Julia cells; quarto render produces clean, self-contained HTML with figures, tables, and cross-references. It is mature, Posit-backed, and free.

marimo replaces the notebook side. Reactive Python notebooks stored as plain .py files, with an export html command that snapshots the whole notebook — outputs included — into a single HTML file.

Both produce better-looking artifacts than Datapane's block layout did. Neither answers the question Datapane's upload call answered.

The publishing half is the gap

dp.upload_report() did four things in one line:

  1. Hosted the artifact at a stable URL.
  2. Made it shareable — link-first, with visibility controls.
  3. Made it discussable — teammates commented on the report itself instead of in a Slack thread next to it.
  4. Versioned it — re-upload and the same link showed the new run.

What ex-Datapane users do today instead: render with Quarto, then push to GitHub Pages (public, no comments, no access control), or Netlify (same), or S3 (a URL to raw HTML is not a review surface), or paste a screenshot into Slack (feedback scatters, the chart is now a picture). Each of these recovers hosting and loses sharing, discussion, and versioning.

Comma is the publish-share-discuss layer

Comma starts where your renderer stops: at the HTML.

  • One call to publish. POST /api/v1/reports with the rendered HTML returns a share URL. From a Makefile, a CI step, a cron job, or the last cell of a notebook:
jq -Rs '{title: "Weekly metrics", html: .}' report.html |
  curl -s -X POST https://commareports.com/api/v1/reports \
    -H "Authorization: Bearer $COMMA_API_TOKEN" \
    -H "Content-Type: application/json" \
    --data-binary @-
  • Faithful rendering. The HTML renders untouched inside an opaque-origin sandbox. Comma doesn't reformat or restyle what your tool produced.
  • Anchored comments. Reviewers pin comments to a specific paragraph or table cell, Google-Docs style — the discussion lives on the artifact, not beside it. Commenters are free on every plan.
  • Share roles. Private, registered-users-only, or public; link permission set to view, comment, or edit. Datapane's visibility controls, plus per-link permissions.
  • Revisions on a stable URL. PATCH /api/v1/reports/:id with new HTML appends a revision; reviewers' bookmark keeps working and Comma can diff runs.
  • Agent-native. The same scoped comma_sk_… token gates the REST API and an MCP server, so a Claude Code or Cursor agent publishes with create_report and reads feedback with list_comments. Datapane never had to think about agents; in 2026 they produce a large share of the reports worth reviewing.

What Comma deliberately does not do: build the report. There is no block API, no dp.Table(df). Your renderer — Quarto, marimo, Plotly's to_html(), Jinja, pandas styling, an LLM — owns the artifact. Comma owns what happens after.

The replacement stack, concretely

Datapane piece 2026 replacement
Python block layout (dp.Report) Quarto .qmd / marimo notebook / own templates
dp.upload_report() POST /api/v1/reports → share URL
Hosted report page Comma report view (sandboxed, faithful)
Comments on reports Anchored comments on text and table cells
Re-upload to update PATCH → new revision, same link
Scheduled reports (Teams plan) Comma routines — daily on Pro, hourly on Team

Costs: Quarto and marimo are free and open source. Comma is free to publish and collaborate; $9/month (Pro) adds daily scheduled routines, $75/seat (Team) adds hourly cadence and shared workspaces. Only creators pay — reviewers and commenters are always free.

Migration path

  1. Port the report body to Quarto or marimo (or keep whatever already produces your HTML — Comma doesn't care where it came from).
  2. Create a Comma token under Settings → API tokens.
  3. Add the publish step above to the end of your render script.
  4. Drop the returned share_url wherever the Datapane link used to go.

The loop you had — render in Python, one line to publish, teammates discuss on the report — comes back, with the discussion now anchored to the exact line being discussed.

Create your first report →

Related