Find stories in data

PyPI Changelog Python 3.x License discord mastodon: @datasette

Annotated version of this introductory video

Datasette is a tool for exploring and publishing data. It helps people take data of any shape, analyze and explore it, and publish it as an interactive website and accompanying API.

Datasette is aimed at data journalists, museum curators, archivists, local governments, scientists, researchers and anyone else who has data that they wish to share with the world. It is part of a wider ecosystem of 44 tools and 154 plugins dedicated to making working with structured data as productive as possible.

Try a demo and explore 33,000 power plants around the world, then follow the tutorial or take a look at some other examples of Datasette in action.

Then read how to get started with Datasette, subscribe to the monthly-ish newsletter and consider signing up for office hours for an in-person conversation about the project.

Datasette Desktop is a macOS desktop application for easily running Datasette on your own computer!

Exploratory data analysis

Import data from CSVs, JSON, database connections and more. Datasette will automatically show you patterns in your data and help you share your findings with your colleagues.

Instant data publishing

datasette publish lets you instantly publish your data to hosting providers like Google Cloud Run, Heroku or Vercel.

Rapid prototyping

Spin up a JSON API for any data in minutes. Use it to prototype and prove your ideas without building a custom backend.

Latest news

29th January 2026 #

Datasette 1.0a24 introduces a new await request.form(files=True) method for accepting file uploads, plus various other changes.

5th November 2025 #

Datasette 0.65.2 and Datasette 1.0a21 have been released with a security fix for an open redirect error, see this advisory. The latest Datasette alphas also include a breaking change to Datasette's permission system, described in detail in A new SQL-powered permissions system in Datasette 1.0a20.

6th February 2025 #

Datasette 1.0a17 is the latest Datasette 1.0 alpha release, with bug fixes and small feature improvements from the last few months.

7th October 2024 #

Python 3.13 was released today. Datasette 1.0a16 is compatible with Python 3.13, but Datasette 0.64.8 was not. The new Datasette 0.65 release fixes compatibility with the new version of Python.

5th August 2024 #

Datasette 1.0a14 includes some breaking changes to how metadata works for plugins, described in detail in the new upgrade guide. See also the annotated release notes that accompany this release.

18th February 2024 #

Datasette 1.0a10 is a focused alpha that changes some internal details about how Datasette handles transactions. The datasette.execute_write_fn() internal method now wraps the function in a database transaction unless you pass transaction=False.

16th February 2024 #

Datasette 1.0a9 adds basic alter table support to the JSON API, tweaks how permissions works and introduces some new plugin debugging utilities.

7th February 2024 #

Datasette 1.0a8 introduces several new plugin hooks, a JavaScript plugin system and moves plugin configuration from metadata.yaml to datasette.yaml. Read more about the release in the annotated release notes for 1.0a8.

1st December 2023 #

Datasette Enrichments is a new feature for Datasette that supports enriching data by running custom code against every selected row in a table. Read Datasette Enrichments: a new plugin framework for augmenting your data for more details, plus a video demo of enrichments for geocoding addresses and processing text and images using GPT-4.

30th November 2023 #

datasette-comments is a new plugin by Alex Garcia which adds collaborative commenting to Datasette. Alex built the plugin for Datasette Cloud, but it's also available as an open source package for people who are hosting their own Datasette instances. See Annotate and explore your data with datasette-comments on the Datasette Cloud blog for more details.

22nd August 2023 #

Datasette 1.0a4 has a fix for a security vulnerability in the Datasette 1.0 alpha series: the API explorer interface exposed the names of private databases and tables in public instances that were protected by a plugin such as datasette-auth-passwords, though not the actual content of those tables. See the security advisory for more details and workarounds for if you can't upgrade immediately. The latest edition of the Datasette Newsletter also talks about this issue.

15th August 2023 #

datasette-write-ui: a Datasette plugin for editing, inserting, and deleting rows introduces a new plugin adding add/edit/delete functionality to Datasette, developed by Alex Garcia. Alex built this for Datasette Cloud, and this post is the first announcement made on the new Datasette Cloud blog - see also Welcome to Datasette Cloud.

9th August 2023 #

Datasette 1.0a3 is an alpha release of Datasette that previews the new default JSON API design that’s coming in version 1.0 - the single most significant change planned for that 1.0 release.

1st July 2023 #

New tutorial: Data analysis with SQLite and Python. This tutorial, originally presented at PyCon 2023, includes a 2h45m video and an extensive handout that should be useful with or without the video. Topics covered include Python's sqlite3 module, sqlite-utils, Datasette, Datasette Lite, advanced SQL patterns and more.

24th March 2023 #

I built a ChatGPT plugin to answer questions about data hosted in Datasette describes a new experimental Datasette plugin to enable people to query data hosted in a Datasette interface via ChatGPT, asking human language questions that are automatically converted to SQL and used to generate a readable response.

All news

Latest releases

8th April 2026

datasette-graphql 3.0a1 - Datasette plugin providing an automatic GraphQL API for your SQLite databases

  • Upgrade for compatibility with datasette>=1.0a20. #102, #103

datasette-atom 0.10a0 - Datasette plugin that adds a .atom output format

  • Compatible with Datasette 1.0 alphas.

dogsheep-beta 0.11 - Build a search index across content from multiple SQLite database tables and run faceted searches against it using Datasette

  • Upgrade for compatibility with Datasette 1.0 alphas.

datasette-template-sql 1.0.3 - Datasette plugin for executing SQL queries from templates

  • Upgraded for compatibility with Datasette 1.0a26+

1st April 2026

datasette-extract 0.3a0 - Import unstructured data (text and images) into structured tables

  • Now uses datasette-llm to manage model configuration, which means you can control which models are available for extraction tasks using the extract purpose and LLM model configuration. #38

31st March 2026

llm 0.30 - CLI utility and Python library for interacting with Large Language Models from organizations like OpenAI, Anthropic and Gemini plus local models installed on your own machine.

  • The register_models() plugin hook now takes an optional model_aliases parameter listing all of the models, async models and aliases that have been registered so far by other plugins. A plugin with @hookimpl(trylast=True) can use this to take previously registered models into account. #1389
  • Added docstrings to public classes and methods and included those directly in the documentation.

18th March 2026

datasette 1.0a26 - An open source multi-tool for exploring and publishing data

New column_types system

Table columns can now have custom column types assigned to them, using the new column_types table configuration option or at runtime using a new UI and POST /<database>/<table>/-/set-column-type JSON API.

Built-in column types include url, email, and json, and plugins can register additional types using the new register_column_types() plugin hook. (#2664, #2671)

Column types can customize HTML rendering, validate values written through the insert, update, and upsert APIs, and transform values returned by the JSON API. They can optionally restrict themselves to specific SQLite column types using sqlite_types. This feature also introduces a new set-column-type permission for assigning column types to a table. (#2672)

The render_cell() plugin hook now receives a column_type argument containing the assigned type instance, and a column type's own render_cell() method takes priority over the plugin hook chain.

The datasette-files plugin will be the first to use this new feature.

UI for selecting columns and their order

Table and view pages now include a dialog for selecting and re-ordering visible columns. (#2661)

Other changes
  • Fixed allowed_resources("view-query", actor) so actor-specific canned queries are returned correctly. Any plugin that defines a resources_sql() method on a Resource subclass needs to update to the new signature, see the resources_sql() method documentation for details.
  • Column actions can now be accessed in mobile view via a new "Column actions" button. Previously they were not available on mobile because table headers are not displayed there. (#2669, #2670)
  • Row pages now render foreign key values as links to the referenced row. (#1592)
  • The startup() plugin hook now fires after metadata and internal schema tables have been populated, so plugins can reliably inspect that state during startup. (#2666)

17th March 2026

llm 0.29 - CLI utility and Python library for interacting with Large Language Models from organizations like OpenAI, Anthropic and Gemini plus local models installed on your own machine.

  • The -t/--template option now works correctly with the -x/--extract and --xl/--extract-last flags.
  • llm logs now shows any additional model options in the Markdown output. #1322
  • New OpenAI models: gpt-5.4, gpt-5.4-mini, gpt-5.4-nano. #1376

7th March 2026

dclient 0.5a3 - A client CLI utility for Datasette instances

27th February 2026

dclient 0.5a2

26th February 2026

dclient 0.5a1

dclient 0.5a0

datasette-auth-tokens 0.4a12 - Datasette plugin for authenticating access using API tokens

datasette 1.0a25 - An open source multi-tool for exploring and publishing data

write_wrapper() plugin hook for intercepting write operations

A new write_wrapper() plugin hook allows plugins to intercept and wrap database write operations. (#2636)

Plugins implement the hook as a generator-based context manager:

@hookimpl
def  write_wrapper(datasette, database, request):
    def  wrapper(conn):
        # Setup code runs before the write
        yield
        # Cleanup code runs after the write

    return wrapper
register_token_handler() plugin hook for custom API token backends

A new register_token_handler() plugin hook allows plugins to provide custom token backends for API authentication. (#2650)

This includes a backwards incompatible change: the datasette.create_token() internal method is now an async method. Consult the upgrade guide for details on how to update your code.

render_cell() now receives a pks parameter

The render_cell() plugin hook now receives a pks parameter containing the list of primary key column names for the table being rendered. This avoids plugins needing to make redundant async calls to look up primary keys. (#2641)

Other changes
  • Facets defined in metadata now preserve their configured order, instead of being sorted by result count. Request-based facets added via the _facet parameter are still sorted by result count and appear after metadata-defined facets. (#2647)
  • Fixed --reload incorrectly interpreting the serve command as a file argument. Thanks, Daniel Bates. (#2646)

8th February 2026

datasette-pretty-traces 0.7 - Prettier formatting for ?_trace=1 traces

  • Now intercepts fetch() calls and adds those to the visible traces on the page. #10
  • uv run pytest can now run the tests on a fresh checkout.

All releases