NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #4129 most downloaded on PyPI
Python DataFrames as interactive DataTables
Last release 2 months ago
22 Jul 2026
Release timing varies
gaps range from 8 days to 3 months
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
7 years old
94 releases · first in 2019
The static preview's small, linked "ⓘ" marker (see the 2.9.0 entry below) is now preceded by a "🔒" hint specifically when the notebook you're viewing
Added
<noscript> element so it only shows up in that actionable case: it stays hidden once the notebook is trusted, and on read-only renders (e.g. GitHub's .ipynb preview) where trusting isn't available anyway.Changed
itables.options are now checked as they are assigned, rather than only when the next table is rendered. A typo in an option name, or an option with an unexpected type, is now reported at the assignment itself (#601).show is now checked before itables transforms them, so that the warning quotes the option as you wrote it. Also, every item of a collection is now checked (rather than just the first one as was previously the case)Fixed
Categorical columns with Polars 1.32 and above (#607).One column per quarter.
The interactive HTML table now shows a plain, static HTML table by default, right next to the (initially hidden) interactive table, so that viewers th
Added
.ipynb files, or an untrusted notebook) get a readable table instead of a broken or empty one. We have also added itables.to_markdown_table(), a simple, static Markdown table representation of a dataframe; itables.show() prints it instead of the interactive table when it can't expect a working, JavaScript-powered display at all (no IPython, or a non-Jupyter/terminal session). See the new Fallbacks documentation section (#575)Changed
conda-build, and dependencies in the pytest matrix are now installed with uv instead of pip.python3 kernel for the documentation - this removes the need for a custom kernel.Fixed
ITable widget and with the documentation, where the table controls (search box, page length) turned dark but the table itself stayed light (#426):
data-vscode-theme-kind attribute on the outer notebook webview's <body>, so itables' dark-mode detection now also looks at ancestor documents, not just the widget's own.div.dt-container now paints its own theme-aware background and text color instead of relying on transparency and inheritance..cell-output-ipywidget-background container(s), hardcoded to white regardless of the editor's theme, which showed up as a thick white border around the widget; the ITable widget's CSS now repaints it too, whenever it's actually hosting an ITable (other widgets are left untouched).We have added a css argument to show (and a matching itables.options.css ) to inject custom CSS. Unlike display(HTML(f"<style>{css}</style>")) , this
Added
css argument to show (and a matching itables.options.css) to inject custom CSS. Unlike display(HTML(f"<style>{css}</style>")), this CSS is embedded in the output of every table, so it does not depend on that separate cell's output being rendered - some notebook front-ends (e.g. VS Code) defer rendering outputs that are scrolled out of view, so a standalone CSS cell may not take effect until it becomes visible (#572).Changed
pytest matrix jobs now install the wheel built once by build-wheel instead of each rebuilding the JS bundle from source, tests now run in parallel with pytest-xdist, and pytest-pixi-updated (which overlaps with the weekly scheduled run) is skipped on pull requests.Fixed
columnControl={"content": ["searchDropdown"]}) (#536).dash version used to generate src/itables_for_dash/ITable.py is now pinned to dash==4.4.0 to avoid jitter in ITable.py.Security
github-script template.We have added the Scroller extension of DataTables to the dt_for_itables package. Use scroller=True together with scrollY to enable virtual scrolling
Added
dt_for_itables package. Use scroller=True together with scrollY to enable virtual scrolling for large tables. The deferRender option is also now supported and pairs naturally with Scroller for improved rendering performance #380.dt_for_itables package. Use colReorder=True to let users drag and drop column headers to reorder them.Categorical columns ( pd.CategoricalDtype , pl.Categorical , pl.Enum ) are now sorted according to the category order rather than alphabetically. Null
Added
pd.CategoricalDtype, pl.Categorical, pl.Enum) are now sorted according to the category order rather than alphabetically. Null/missing values sort first. Set add_rank_to_categories=False to revert to alphabetical sorting (#501).pixi run -e build hatch buildpixi run -e streamlit-app streamlit run apps/streamlit/itables_app.pyChanged
st.components.v2, which renders inline (no iframe) and uses a cleaner function-based lifecycle (#521, #519)dt_for_itables (#545), itables_anywidget (#544), and itables_for_dash (#546)@babel/plugin-transform-modules-systemjs (#547)Fixed
postcss in itables_for_dash to address a security issue (#549)TypeError raised by dash-generate-components when building itables_for_dash with npm run buildWe have fixed a DataTables "Requested unknown parameter" warning triggered when updating an ITable widget to a dataframe with a different column struc
We have fixed a ValueError raised by to_html_datatable on columns with numpy floating scalars ( float32 , float16 ) containing NaN or Inf values ( #52
Fixed
ValueError raised by to_html_datatable on columns with numpy floating scalars (float32, float16) containing NaN or Inf values (#524). Thanks to Luke Tsekouras for reporting this!We have updated the dependencies of the ITables extension for Dash to address three vulnerability issues
Added
dt_for_itables package (#496). Thanks to kultura-luke for suggesting this!Changed
Fixed
columnControl to option.py. Thanks to kultura-luke for pointing out at this (#496)Floats are formatted using the underlying dataframe formatter when format_floats_in_python is "auto" (the default). Set that option False if you want
Changed
format_floats_in_python is "auto" (the default). Set that option False if you want to format the values in JS directly (#483).x._s.get_fmt (#471)dt_for_itables to the latest version of datatables.net-dt==2.3.7 (#485)itables.toml configuration file with just classes = ["display", "nowrap"] to revert the change locally.Fixed
Floats are formatted using the underlying dataframe formatter when format_floats_in_python is "auto" (the default). Set that option False if you want
Changed
format_floats_in_python is "auto" (the default). Set that option False if you want to format the values in JS directly (#483).x._s.get_fmt (#471)dt_for_itables to the latest version of datatables.net-dt==2.3.7 (#485)itables.toml configuration file with just classes = ["display", "nowrap"] to revert the change locally.Fixed
Floats are formatted using the underlying dataframe formatter when format_floats_in_python is "auto" (the default). Set that option False if you want
Changed
format_floats_in_python is "auto" (the default). Set that option False if you want to format the values in JS directly (#483).x._s.get_fmt (#471)dt_for_itables to the latest version of datatables.net-dt==2.3.7 (#485)Fixed
The typing_extensions package is required for static type checking on Python <= 3.10
Fixed
typing_extensions package is required for static type checking on Python <= 3.10 (#473)We have fixed a conda build error: TypeError: typing.Any is not subscriptable (#468), and added more tests
Fixed
TypeError: typing.Any is not subscriptable (#468), and added more testsITables has no dependencies (#457,#465). Also, it has been tested with Python 3.14.
Added
show_dtypes option. It defaults to "auto", meaning that dtypes are only shown for Polars Dataframes by default (#449)show_df_type (defaults to False) to show the DataFrame or Series type (#448)float_precision, if set on the pl.Config object (#447)Fixed
hatch<1.16.0 to build ITables (jupyter-builder-#40)datadog (#451)Changed
platformdirs is an optional dependency of ITables
Fixed
platformdirs is an optional dependency of ITables (#437)Nothing published for this version
tomli is an optional dependency of ITables
Changed
tomli is an optional dependency of ITables (#436)The offline mode now allows the init cell to be rendered after the table cells. It should work more reliably in VS Code
Fixed
Added
columnControl extension that was recently added to DataTables (blog post) (#403)itables.toml configuration file, either in the current or in a parent folder (#429)Changed
html argument in itables.sample_dfs.get_countries. It now defaults to False, in which case the example dataframes contains no HTML code.The showIndex argument is now ignored when df is a Polars DataFrame
We have fixed an assertion when a table_id is passed to DT
Fixed
table_id is passed to DT (#417)Fixed
table_id argument is passed to DT (#417)We have fixed an issue with an index not shown when polars is not installed
Fixed
polars is not installed (#415)Fixed
polars was not installed (#415)We have added a Framework :: Dash classifier to highlight the fact that ITables has a component for Dash
Added
Framework :: Dash classifier to highlight the fact that ITables has a component for DashFixed
We enforce strict pyright on the ITables documentation (#395) and on the example apps
Added
Changed
warn_on_undocumented_option option now defaults to True and only check the option nameswarn_on_unexpected_option_type that defaults to warn_on_undocumented_option when typeguard>=4.4.1 is installed (False otherwise)Fixed
itable.options even for the options that don't have a default value (#224)style argument is now supported again (#386)fillable=False in the output_widget (#360)The dom argument (deprecated in v2.0) has been removed.
Added
show function. They can show non-finite floats, bigints, Pandas Style objects and use custom JavaScript formatters (#374)show function and for the various app components. A SyntaxWarning is issued if either the argument name or type does not match when warn_on_undocumented_option=True (the default when typeguard>=4.4.1 is installed)Changed
allow_html=True to display HTML content (use this option only if you trust the content of the table!) (#346)dom argument (deprecated in v2.0) has been removed.Fixed
text_in_header_can_be_selected (defaults to True). With that option the text in headers can be selected, giving you the option to select and copy the column names back to your Python code.The dom argument (deprecated in v2.0) has been removed.
Added
show function. They can show non-finite floats, bigints, Pandas Style objects and use custom JavaScript formatters (#374)show function and for the various app components. A SyntaxWarning is issued if either the argument name or type does not match when warn_on_undocumented_option=True (the default when typeguard>=4.4.1 is installed)Changed
allow_html=True to display HTML content (use this option only if you trust the content of the table!) (#346)dom argument (deprecated in v2.0) has been removed.The dom argument (deprecated in v2.0) has been removed.
Added
show function. They can show non-finite floats, bigints, Pandas Style objects and use custom JavaScript formatters (#374)show function and for the various app components. A SyntaxWarning is issued if either the argument name or type does not match when warn_on_undocumented_option=True (the default when typeguard>=4.4.1 is installed)Changed
allow_html=True to display HTML content (use this option only if you trust the content of the table!) (#346)dom argument (deprecated in v2.0) has been removed.ITable now has a component for Dash! You can render your Python DataFrames in your Dash application with from itables.dash import ITable
Added
from itables.dash import ITable (#245)Changed
all_interactive argument of itables.init_notebook_mode to Trueitables.optionsdt_for_itables to datatables.net-dt==2.2.2 and datatables.net-select-dt==3.0.0We have removed an erroneous assertion and added tests on the warnings issued when selected rows are not displayed
Fixed
We have fixed an issue with the HTML export of multiple tables in the same cell
Table footers continue to work when the notebook is exported to HTML
We have fixed a HTML pop up warning when displaying Pandas Style objects in Quarto
We fixed an issue with the Streamlit component when selected_rows was not set.
Fixed
selected_rows was not set.ITables has a Jupyter Widget (#267). Our widget was developed and packaged using AnyWidget which I highly recommend!
Added
selected_rows attribute of the ITable widget, the returned value of the Streamlit interactive_table component, or the {table_id}_selected_rows input in Shiny (#208, #250)ui.HTML(init_itables()) to your applicationChanged
tableId argument of to_html_datatable has been renamed to table_idFixed
DataTables was updated to its latest version (2.1.6)
Fixed
ui.nav_panel when ui.nav is not availableWe have fixed an OverflowError (_can't convert negative int to unsigned_) when displaying Polars DataFrames that contain unsigned integers
Fixed
We have improved the detection of large integers in the context of Polars DataFrames
Fixed
The dependencies of the streamlit components have been updated to fix a vulnerability in ws (Alert #1)
Changed
overflow:auto on div.dt-layout-table>div. Thanks to this we now get an automatic horizontal scrolling in Jupyter, Jupyter Book and also Streamlit if the table is too wide (#282).Fixed
ws (Alert #1)We have added an explicit encoding argument in the calls to read_text to address an issue seen on Windows (#252).
Fixed
encoding argument in the calls to read_text to address an issue seen on Windows (#252).Changed
dt-container equal to {max-width:100%}.datatables.net-dt to 2.0.8, and included the column visibility button in the dt_for_itables package (#284)ITables now uses the src layout (#246) - many thanks to Mahendra Paipuri for his help on this topic!
Added
Changed
src layout (#246) - many thanks to Mahendra Paipuri for his help on this topic!dt_for_itables' dependencies to datatables.net-dt==2.0.7 and datatables.net-select-dt==2.0.2 (#273)ITables now uses the src layout (#246) - many thanks to Mahendra Paipuri for his help on this topic!
Changed
src layout (#246) - many thanks to Mahendra Paipuri for his help on this topic!dt_for_itables' dependencies to datatables.net-dt==2.0.7 and datatables.net-select-dt==2.0.2 (#273)Added
ITables now uses the src layout (#246) - many thanks to Mahendra Paipuri for his help on this topic!
Changed
src layout (#246) - many thanks to Mahendra Paipuri for his help on this topic!dt_for_itables' dependencies to datatables.net-dt==2.0.7 and datatables.net-select-dt==2.0.2 (#273)Added
ITables now uses the src layout (#246) - many thanks to Mahendra Paipuri for his help on this topic!
Changed
src layout (#246) - many thanks to Mahendra Paipuri for his help on this topic!dt_for_itables' dependencies to datatables.net-dt==2.0.7 and datatables.net-select-dt==2.0.2 (#273)Added
We have added a logo for ITables
Added
Changed
DataTables to 2.0.5 and its extensions to their latest version (#260)maxBytes can now be a string. Its default value remains unchanged at 64KB (#239)Fixed
The CSV, Excel and Print buttons are now included (#50, #155)
The CSV, Excel and Print buttons are now included (#50, #155)
The CSV, Excel and Print buttons are now included (#50, #155)
The CSV, Excel and Print buttons are now included (#50, #155)
Nothing published for this version
The CSV, Excel and Print buttons are now included (#50, #155)
The select and search box now use a white font in VS Code (dark mode) (#232, #156, #103)
ITables works well with Quarto. We have added Quarto examples to the documentation. We set data-quarto-disable-processing="true" on the tables that ar
Added
data-quarto-disable-processing="true" on the tables that are generated with use_to_html=False and thus can't be processed by Quarto (#179)Fixed
df.isetitem(i, ...) rather than df.iloc[:,i] = ... to avoid a warning with Pandas 2.2.0 (#223)Changed
Complex table footers are now in the correct order
Fixed
pandas==2.2.0 (#223, pandas-57229, pandas-55080)HTML in table columns is supported
Changed
We have removed an indirect dependency on jinja2 caused by the Pandas style objects
Fixed
jinja2 caused by the Pandas style objects (#202)We have fixed an issue when rendering Pandas style objects in Google Colab
Fixed
We have added support for Pandas style
Added
Fixed
pandas==2.1 as this fails (pandas-55080)Fixed an OverflowError when displaying Polar tables containing unsigned integers
Fixed
Changed
We fixed an interaction issue with other ui elements in Shiny apps - use from itables.shiny import DT
Fixed
from itables.shiny import DT (#181)Integers that are too big for Javascript are converted to str
Fixed
Added
itables against pandas in pre-release versionsEmpty Polars DataFrame are now rendered correctly
Fixed
Your coding agent can read these notes before it upgrades. Set up the MCP server →