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:
Super simple jupyter type dashboard (with option of using some thing like voila to publish in a form that looks more like an app)
Panel/streamlit/dash etc … Dashboard development tools with tradeoff between flexibility/customisability and difficulty
Python web framework like flask which allows complete flexability but is a bit more advanced
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 |
|---|---|---|---|---|---|---|
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) |
| No native; add reverse proxy or | 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 ( | 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 | Yes (built-in OAuth2, supports Okta) | Multiple processes ( | 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 ( | 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. |