npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@databricks/aibi-client

v1.1.0

Published

Embed Databricks AI/BI dashboards into your external web application. This client library renders a published Databricks dashboard inside any DOM element, with per-user data filtering and audit support via scoped access tokens.

Readme

Databricks AI / BI browser client

Embed Databricks AI/BI dashboards into your external web application. This client library renders a published Databricks dashboard inside any DOM element, with per-user data filtering and audit support via scoped access tokens.

Documentation

For full setup instructions — including how to create a service principal, configure permissions, perform the token exchange, and filter data per user — see the official docs:

Embedding for external users → AWS | Azure | GCP

The docs include working example applications in both Python and Node.js.

Usage

Basic Usage

const dashboard = new DatabricksDashboard({
  workspaceId: '1234567890123456',
  instanceUrl: 'https://my-databricks-instance.com',
  container: document.getElementById('dashboard-container'),
  dashboardId: 'abcdedf123456',
  pageId: 'ab12cd34',
  token: tokenThatCanBeSeenByViewers,
});

dashboard.initialize();

Handling Token Expiration for Seamless Viewer Experience

To support long-running dashboard, you can pass a getNewToken function that automatically refreshes the token when it is close to expiration.

const dashboard = new DatabricksDashboard({
  // ...other required options
  getNewToken: async () => {
    // Return a string literal token value to the API
  },
});

Set up Color Scheme

You can configure the embedded dashboard's color scheme using the colorScheme option.

The colorScheme option maps to the CSS color-scheme property, which allows the embedded dashboard to respect or override the user's light or dark preference.

const dashboard = new DatabricksDashboard({
  // ...other required options
  colorScheme: 'light dark', // or "light", or "dark"
});

Programmatic Navigation

You can navigate between dashboards or pages without reloading the iframe using the navigate() method. This provides a smooth transition for users switching between different dashboards.

const dashboard = new DatabricksDashboard({
  // ...other required options
});

dashboard.initialize();

// Navigate to a different dashboard
await dashboard.navigate({ dashboardId: 'xyz789' });

// Navigate to a specific page within a dashboard
await dashboard.navigate({ dashboardId: 'xyz789', pageId: 'page123' });

Important Notes:

  • The navigate() method can only be called after the dashboard has been initialized and loaded
  • The method will throw an error if called before the dashboard is ready or after it has been destroyed

Filter Controls

Read and control the embedded dashboard's filters from your host page. Filters are addressed by their URL identifier (FilterState.id) - the stable handle you should persist and pass back, not the human-readable displayName.

Call getFilters() and read each filter's id. Use its displayName (the widget's title) to tell which filter is which. IDs are of the form <pageId>~<widgetId> and do not change when the dashboard is edited. They only change when an author updates them explicitly. See the public docs for more info (AWS | Azure | GCP)

To provide a human-readable ID, open a dashboard in draft mode, select a filter widget (or a page) and use the Update URL Identifier button. The value you set there is exactly what getFilters() returns and what setFilters() expects.

Detecting filter readiness

onFiltersReady fires at most once, when filter controls become available, with the initial filter snapshot. Use this to determine when the embedded dashboard has finished rendering and can receive filter updates. Late subscribers still fire. It never fires if the embedded dashboard never becomes ready.

This isn't strictly necessary to know when it's safe to call getFilters() or setFilters(). Those methods will buffer early requests until the embedded dashboard is ready.

dashboard.onFiltersReady(({ filters }) => {
  renderFilterControls(filters);
});

Reading filters

getFilters() returns the current state of every filter - its id, widgetType, displayName, whether it is at its author-configured default (isDefault), and its current value.

const filters = await dashboard.getFilters();

Setting filters

setFilters() writes one or more values, each targeting a filter by id. Alongside concrete values, some filters accept these built-in sentinels:

  • { all: true }
  • { none: true }
  • { default: true } (reset to the author-configured default)
await dashboard.setFilters([
  { id: 'sales~region', type: 'single-select', value: 'US' },
  { id: 'sales~category', type: 'multi-select', values: ['Books', 'Toys'] },
  { id: 'sales~date', type: 'date-range', min: { default: true }, max: { default: true } },
]);

On dashboards configured for apply mode (selections staged until the viewer clicks "Apply"), pass { apply: false } to stage values instead of committing them, then commit or discard the staged set:

await dashboard.setFilters([{ id: 'sales~region', type: 'single-select', value: 'US' }], {
  apply: false,
});
await dashboard.applyStagedFilters(); // or dashboard.cancelStagedFilters()

applyStagedFilters() and cancelStagedFilters() are no-ops (still resolving) on dashboards that are not in apply mode.

Reacting to changes

onFiltersChanged fires whenever a filter's value changes (from viewer interaction, an applied setFilters call, or a URL restore) with a snapshot of every filter. It does not fire on subscribe. Use onFiltersReady or getFilters() for the initial state.

const unsubscribe = dashboard.onFiltersChanged((filters) => {
  console.log('filters changed', filters);
});
// later: unsubscribe();