Buckaroo: an interactive data table that replaces df.head in notebooks
Buckaroo - The data table UI for Notebooks. Quickly explore dataframes, scroll through dataframes, search, sort, view summary stats and histograms. Works with Pandas, Polars, Jupyter, Marimo, VSCode Notebooks
At a glance
- What is it?
- Buckaroo is a Jupyter data table built on AG-Grid that takes over as the default display for pandas and Polars dataframes once imported, with lazy loading, histograms, summary stats, search, sorting and an autocleaning layer that parses dirty columns. It also ships an MCP server so Claude Code can open CSV, TSV, Parquet and JSON files in the same table UI.
- Who is it for?
- Adopt Buckaroo if you spend your day in a notebook looking at dataframes and have concluded that df.head is not a data exploration tool, and you want histograms, summary stats and search on the same grid. Do not adopt it if you work outside notebooks, since the whole thing is a Jupyter widget, or if you need a stable data frame display in a non interactive environment.
- Can I use it commercially?
- Yes. BSD-3-Clause is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 2 days ago.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.
Editorial analysis
The dataframe display, taken over by default
Buckaroo is described as a modern data table for Jupyter that expedites the most common exploratory data analysis tasks, and the argument is that the most basic of those tasks, looking at the raw data, is cumbersome with existing pandas tooling.
The mechanism is unusually direct. When you import buckaroo, it becomes the default display for Pandas and Polars DataFrames. There is no widget to construct and no function to call around your data, the import itself changes how dataframes render in the notebook.
The core table is built on AG-Grid, and the README makes two claims about it: it loads thousands of cells in under a second, and data is loaded lazily into the browser as you scroll and serialised with parquet. That second point is the important one. You no longer have to use df.head to poke at portions of your data, because the grid pulls what it needs as you scroll rather than shipping the whole frame up front.
On top of the grid sit the analysis features: summary stats, histograms, smart sampling, auto-cleaning and a low code UI. The README stresses that all of it has sensible defaults that can be overridden to fit your workflow, which is the right framing for a tool that hijacks the default display of a dataframe, since the moment it is imported it changes how every other cell in the session renders.
Autocleaning, and the judgement call it makes for you
Autocleaning is the feature that changes your data rather than just showing it, and it is the one to read carefully before enabling.
The mechanism: you select a cleaning method from the status bar, and the autocleaning system inspects each column and runs statistics to decide whether cleaning should be applied. The operations it considers include parsing dates, stripping non-integer characters and parsing implied booleans such as yes and no. Whatever it decides goes into the low code UI, where you can see the operations as generated code and change them.
The README is explicit about why this is a judgement call rather than a rule. Different cleaning methods can be tried because dirty data is not deterministic. In other words, the system proposes, and the low code UI is where you accept, reject or adjust the proposal.
The entry point is a widget, and it takes an auto_clean argument:
import pandas as pd
import buckaroo
pd.DataFrame({'a': [1, 2, 10, 30, 50, 60, 50], 'b': ['foo', 'foo', 'bar', pd.NA, pd.NA, pd.NA, pd.NA]})and the cleaning path is reached through BuckarooWidget(df, auto_clean=True).
The underlying problem is visible in that example frame. The b column mixes strings with pd.NA missing values, which is the kind of column where a date column or a boolean column is hiding, and statistics on the column are what let the system decide which reading is right. This is genuinely useful for real world files, and genuinely risky, because a column that looks like a date might be an identifier. That is why the proposal is inspectable code rather than a silent transformation, and why the choice of cleaning method is left to you.
The grid features: histograms, summary stats, sorting and search
The feature list is where the difference from a plain dataframe repr becomes concrete.
Histograms exist for every column and give a quick overview of the distribution of values, including uniques and N/A counts. That is the piece a notebook user is most often missing, since df.describe gives numbers but not a shape.
Summary stats are similar to df.describe and extensible. The entry point is small: the summary stats view can be toggled by clicking on the 0 below the Σ icon, which is a small interface detail that tells you the whole design leans on icons and a compact status bar rather than menus.
Sorting is available on all visible data by clicking a column name, and further clicks change the sort direction and then disable sorting for that column. The README explains why extreme values matter here: because extreme values are included with sample rows, you can see outlier values too. That is a design decision with consequences. Sampling usually means your outliers are missing, and the outliers are the rows you most wanted to see.
Search is built in, so you can find the rows you are looking for without writing a boolean mask.
Formatting is handled by default with fixed width formatting. By default numeric columns are formatted to use a fixed width font and commas are added, which allows quick visual confirmation of magnitudes in a column. For a table where the first thing you want is a sense of scale, that is a sensible default.
The low code UI is toggled by clicking the checkbox below the λ icon, and it is where the generated Python lives.
A Pluggable Analysis Framework, with errors contained on purpose
Summary stats are built on what the README calls the Pluggable Analysis Framework, which allows individual summary stats to be overridden and new summary stats to be built in terms of existing ones.
That is the extension model, and it is worth being precise about what it means. You do not add a new statistic by writing a widget; you add it by defining a stat that composes with the ones already there, which is a much better fit for a framework that computes many derived values per column.
The detail in the README that deserves attention is the failure policy. Care is taken to prevent errors in summary stats from preventing display of a dataframe. That is a deliberate containment design, and it is the opposite of what you might expect from a data tool, where a broken statistic would normally raise and stop you.
The reasoning is sound in context. A summary stat is decoration on top of your data, and a crash in the decoration should never cost you the ability to look at the data. The trade-off is that failures become quieter, so a broken custom stat can look like an empty or missing value rather than an error, and you need to test your own stats to know they are working.
The repository supports the same extensibility story on the packaging side. The root holds a buckaroo package, a packages directory, a buckaroo_mcp_tool.py module, docs, plans, scripts and tests, with a uv.lock file and a pyrightconfig.typecheck.json for type checking, a CHANGELOG.md, a CLAUDE.md, a CONTRIBUTING.md and a .pre-commit-config.yaml. The framework is the reason a project like this can be extended without forking it.
The MCP server that lets Claude Code open your data files
The most interesting new surface in the README is the Model Context Protocol integration, which turns Buckaroo into an MCP server for Claude Code, giving Claude the ability to open data files in an interactive table viewer.
The install is one command:
claude mcp add buckaroo-table -- uvx --from "buckaroo[mcp]" buckaroo-tableThe README explains the mechanics: this downloads Buckaroo from PyPI into an isolated environment and registers the MCP server, and no other installation steps are needed. The uvx invocation with the from specification is what gives you the isolation, and the extra name in the bracket selects the optional dependency group that carries the MCP server.
Usage is conversational. You ask Claude Code to view any CSV, TSV, Parquet or JSON file, for example to show me sales_data.csv, and Claude calls the view_data tool, which opens the file in Buckaroo's interactive table UI in your browser.
This is a small feature that changes the shape of the tool. Buckaroo was designed to be the display layer for a dataframe that already exists in your session. The MCP path lets the data arrive from outside the session entirely, which means the table becomes a viewer for files rather than for variables, and the data table becomes something an assistant can open on your behalf.
There is a browser route as well, with a full tour available on Marimo that needs no installation at all, and the README invites you to play with Buckaroo without installing anything.
Where it runs, and what it needs
The compatibility section is a checklist, and it is worth reading before you install anything.
On the notebook side, Buckaroo works in jupyter lab version 3.6.0 or later, jupyter notebook version 7.0 or later, Marimo, VS Code notebooks with an extra install, Jupyter Lite, Google Colab, and Claude Code through the MCP server.
On the dataframe side it supports pandas from version 1.3.5, and Polars as an optional install with pip install buckaroo[polars]. The pandas floor is 1.3.5 and the project metadata asks for Python 3.11 or later, and the classifier list mentions Python 3.10 as well, so the supported floor is somewhere in that region and the metadata is not entirely consistent about it.
The dependency list explains a lot about the runtime. It pulls in anywidget, which is how the grid is embedded in a notebook, fastparquet for the parquet serialisation mentioned earlier, cloudpickle, and pyarrow with version pins per Python release, including a comment that 2026.3.0 is missing x86_64 Linux wheels and that 21.0.0 has no cp314 wheel. The project is explicit about the reasons for each pin, which is a small sign of a maintainer who has been bitten by them.
The release history shows steady work: 0.15.10 on 2026-10-06, 0.15.9 on 2026-10-01 and 0.15.8 on 2026-09-28, with the last push on 2026-10-21. The licence is BSD-3-Clause, with the file named LICENSE.txt, and the package metadata records it as an OSI approved BSD licence. For a tool that runs inside other people's notebooks, a permissive licence matters, and the version numbering at 0.15 says the API is still moving.
Editorial conclusion
Adopt Buckaroo if you spend your day in a notebook looking at dataframes and have concluded that df.head is not a data exploration tool, and you want histograms, summary stats and search on the same grid. Do not adopt it if you work outside notebooks, since the whole thing is a Jupyter widget, or if you need a stable data frame display in a non interactive environment. Verify first that your notebook environment is on the supported list, jupyter lab 3.6.0 or later or jupyter notebook 7.0 or later, that your pandas version is 1.3.5 or later, and that you are comfortable with a table that serialises your dataframe to parquet and streams it to the browser, because that is where the performance claim comes from and also where the memory cost goes.
Frequently asked questions
What is Buckaroo?
Buckaroo is a data table UI for notebooks, built on AG-Grid, that expedites exploratory data analysis tasks. When you import buckaroo it becomes the default display for Pandas and Polars DataFrames, so you no longer need df.head to look at portions of your data.
Which notebook environments does Buckaroo support?
The README lists jupyter lab version 3.6.0 or later, jupyter notebook version 7.0 or later, Marimo, VS Code notebooks with an extra install, Jupyter Lite, Google Colab and Claude Code through the MCP server. It supports pandas from version 1.3.5 and Polars as an optional install.
How do I install Buckaroo and use it with Claude Code?
The package installs with pip install buckaroo. The Claude Code integration is added with claude mcp add buckaroo-table -- uvx --from "buckaroo[mcp]" buckaroo-table, which downloads Buckaroo into an isolated environment and registers the MCP server, after which Claude can open CSV, TSV, Parquet or JSON files through the view_data tool.
What does Buckaroo's autocleaning do?
You pick a cleaning method from the status bar, and the system inspects each column and runs statistics to decide whether to apply operations such as parsing dates, stripping non-integer characters or parsing implied booleans. The proposed operations are added to the low code UI so they can be reviewed, and different methods can be tried because dirty data is not deterministic.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/buckaroo-data-buckaroo)Was this useful?