A UKRDC Stats dashboard

A UKRDC Stats dashboard

It’s fairly easy to embed a link to a dashboard on our website, as is done in the following ticket:

https://renalregistry.atlassian.net/browse/OPS-8

 

Then it would be a case of finding the easiest way of serving up a link.

Realistically if we want to replace tableau the task is one of developing and hosting a simple app. The options (see ai slop in table below for more detailed comparisons), are summed up by the following:

  1. Super simple jupyter type dashboard (with option of using some thing like voila to publish in a form that looks more like an app)

  2. Panel/streamlit/dash etc … Dashboard development tools with tradeoff between flexibility/customisability and difficulty

  3. Python web framework like flask which allows complete flexability but is a bit more advanced

  4. Non python web framework vue or other

If I (pm) was tasked with development without any other considerations I would probably go for either 1 or 3 depending on the audience and level of polish.

Tool

Embedding Support

Okta/SSO Support

Multi-User Handling

Production Readiness

UI Flexibility

Notes

Tool

Embedding Support

Okta/SSO Support

Multi-User Handling

Production Readiness

UI Flexibility

Notes

JupyterHub

Not designed for embedding (separate hub URL)

Yes (via OAuthenticator, Okta supported)

Per-user isolated kernels

Mature, scales via k8s/Docker

Limited (notebooks + widgets)

Heavyweight; best for multi-user notebook environments

Dash (Python)

<iframe> or Django/Flask integration

No native; add reverse proxy or dash-okta-auth

Shared app instance, session callbacks

Scales with Gunicorn/k8s; Enterprise adds features

High (React/HTML under hood)

Great for custom dashboards; enterprise features gated behind Dash Enterprise

Streamlit (Python)

Easy iframe embedding (?embed=true)

No native; SSO via proxy (e.g. Okta/NGINX/Auth0)

Each user has session state

Lightweight, moderate scaling

Low–Medium (simple layouts, limited theming)

Very fast to build but less enterprise-grade

Panel (Python)

Embed via server_document() script

Yes (built-in OAuth2, supports Okta)

Multiple processes (num_procs), sessions per user

Production-ready (Bokeh server backend)

High (templates, layouts, multiple viz libs)

Flexible; strongest self-hosted Okta story besides JupyterHub

Bokeh Server (Python)

Embed via script (server_document)

No native; must wrap with proxy/auth layer

Each browser session = new Bokeh doc

Stable, can scale with multiple servers

High (low-level HTML/JS control)

More boilerplate; great for custom interactive plots

Voilà (Python)

Embed via iframe

No native; usually via JupyterHub/OAuthenticator

Per-user notebook execution

Simple to run; scales under Hub

Medium (widgets, custom nbconvert templates)

Easiest if dashboards already exist as notebooks

R Shiny (R)

Easy iframe embedding or Shiny Server Pro integration

Shiny Server Pro supports SAML/OIDC (Okta included)

Each user session runs separately

Mature; scales with Shiny Server Pro or Kubernetes

Medium–High (UI via R + HTML templates)

Best for R-centric teams; Pro adds enterprise auth and scaling

Superset (Python/SQL)

Embeddable dashboards via iframes/JWT auth

Yes (OAuth2/OIDC including Okta)

Multi-user by design (role-based access)

Production-grade BI platform

Medium (prebuilt BI UI, not fully custom)

Good for SQL-driven analytics dashboards, less flexible than custom code

Metabase (Java)

Embeddable dashboards (signed JWT for secure embed)

Yes (SAML/OIDC incl. Okta)

Multi-user, role-based access

Enterprise-ready

Low–Medium (limited customization)

Great for quick self-serve BI; more “BI tool” than app framework

Grafana (Go)

Embeddable panels/iframes, signed URLs

Yes (SAML/OIDC incl. Okta)

Multi-user with fine-grained roles

 

 

 

Flask

Easy to embed

Yes (Authlib, Flask-Login, Flask-OIDC, reverse proxy with Okta/OIDC)

Session-based users; scales with standard WSGI deployment

Highly production-ready (Gunicorn/uWSGI, Docker, Kubernetes)

Very High (full control over HTML, CSS, JavaScript, React, Vue, etc.)

Best when building a bespoke analytics application that integrates with Drupal rather than relying on a dashboard framework. More development effort, but offers maximum flexibility and straightforward integration with existing Drupal authentication and services.