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 newsletter and consider signing up for office hours for an in-person conversation about the project.
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 and blog
16th September 2026 #
Datasette 0.65.5 and 1.0a40 are out, with a security fix for a table permisisons bypass. Datasette 1.0a40 also adds a mechanism for plugins to run background tasks.
11th September 2026
18th June 2026
11th June 2026
29th May 2026
24th May 2026
21st May 2026
13th May 2026
19th April 2026 #
Here's a new TIL on using SQL functions in Google Sheets to fetch data from Datasette.
15th April 2026 #
Datasette 1.0a27 changes how CSRF protection works in a way that simplifies form and API integration, and introduces a new RenameTableEvent for when a table is renamed by a SQL query.
18th March 2026 #
Datasette 1.0a26 adds a column_types system allowing columns to carry additional type information such as email or url, or extra types defined by plugins. This alpha also adds a UI for selecting and sorting visible columns on a table page.
25th February 2026 #
Datasette 1.0a25 adds write_wrapper() and register_token_handler() plugin hooks.
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.
Latest releases
6th October 2026
datasette-atom 0.11a0 - Datasette plugin that adds a .atom output format
- Compatible with Datasette>1.0a41
24th September 2026
datasette 1.0a41 - An open source multi-tool for exploring and publishing data
OpenTelemetry support, a new JavaScript API for creating modal dialogs, and several smaller bug fixes.
OpenTelemetry
Datasette now supports OpenTelemetry traces and metrics for monitoring application performance. Thanks, Alex Garcia. (#1730, #2867)
- Traces cover HTTP requests, database queries and startup, including time spent waiting for SQL threads and queued writes.
- Metrics report query latency, time-limit interruptions, SQL thread usage, write queues and open connections.
- New tools for plugin authors help plugins add their own traces and metrics, with shared registry classes and pytest helpers.
To collect telemetry, configure an OpenTelemetry SDK and exporter, then run Datasette using opentelemetry-instrument. See OpenTelemetry for setup instructions.
Other features
- New DatasetteModal JavaScript API for plugins to create dialogs with Datasette's shared styles, keyboard behavior and focus handling. Datasette's built-in dialogs use the same API. (#2790, #2948)
Bug fixes
- Table pages now show measured query timings instead of always displaying 1.2ms. (#2446)
- Facet loading now ignores unrelated query parameters such as
?_facets=x, instead of returning a 500 error. Thanks, Peng Boyu. (#2949) - Foreign key values no longer link to tables that do not exist. Thanks, Dipak Chaudhari. (#1515, #2952)
- Fixed missing punctuation between table and view counts on the homepage, such as
0 tables1view. Thanks, Dipak Chaudhari. (#2012, #2951) - The sort menu now excludes primary keys that are not included in sortable_columns. Thanks, Sanjay Santhanam. (#1980, #2858)
22nd September 2026
llm 0.36 - 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.
New features:
- New OpenAI models:
gpt-6-solfor GPT-6 Sol andgpt-6-lunafor GPT-6 Luna. #1702 - Model plugins can now declare
supports_conversation = Falsefor models that only accept single-turn prompts. LLM raisesllm.ConversationNotSupportedwhen these models receive assistant or tool history, andllm chatrejects them before starting a session. See Models that do not support conversations. The first plugin to use this is llm-typesafe. #1692 - Reasoning traces in the Markdown output of
llm logsare now wrapped in<details><summary>tags. #1701
Bug fixes:
- Fixed
llm logs -tcrashing withKeyError: 'options_json'when displaying truncated logs with options or schemas. Thanks, rdslw. #1656 - Fixed
AsyncResponse.log_to_db()raisingsqlite3.ProgrammingErrorafter a response had been awaited. Structured messages and provider metadata are also preserved when logging restored async responses. Thanks, Roli Bosch. #1668 - Tool parameters and nested model fields named
titleare now preserved in generated input schemas. Thanks, Christopher Pruijsen. #1679, #1680 - Constructing
llm.Promptdirectly without options now initializes the model's defaultOptionsobject, fixing errors in providers that access option attributes. Thanks, Jane Li. #1028, #1663 - Closing an asynchronous
response.astream_events()stream before completion now closes the underlying provider generator, allowing it to release streaming connections and other resources. Thanks, Shunsuke. #1659 - SQLite connections opened by CLI commands are now closed when the command finishes, including on errors, avoiding unclosed-connection warnings.
Documentation:
- Corrected the structured output example in the advanced model plugins documentation to use
supports_schema = True. Thanks, Ethan Stoner. #1686
20th September 2026
datasette-explain 0.2.2 - Explain SQL queries executed using Datasette
- Explain plans now work on read-only stored-query pages.
19th September 2026
datasette-auth-github 1.0 - Datasette plugin and ASGI middleware that authenticates users against GitHub
- Cookies are no longer browser session cookies, they now last
login_max_ageseconds, which defaults to 30 days. #80
16th September 2026
datasette 1.0a40 - An open source multi-tool for exploring and publishing data
A security fix, a new set of APIs providing background tasks for plugins, an endpoint for counting matching rows, and a collection of bug fixes.
Security fix
- Fixed a security issue where a trailing newline in a requested table name could bypass table permissions and expose private rows. Thanks for the report, dpfkdlemtp. GHSA-h547-rmjf-5m2m
Background tasks
Datasette plugins can now use background tasks to run code independent of the Datasette request/response cycle.
- New .add_background_task(func, name=None) API: plugins register supervised, long-lived background work - typically from a startup hook - and these will be launched after every startuphook has run. Tasks are cancelled (with a five-second grace period) on shutdown.
- New /-/tasks JSON debug endpoint lists every supervised background task and its state, in the style of /-/threads. See /-/tasks. It requires the permissions-debug permission.
- New shutdown(datasette) plugin hook, called during graceful shutdown (Ctrl-C, SIGTERM) before background tasks are cancelled and before database connections are closed. It is not called on a hard kill (SIGKILL).
- Plugin asgi_wrapper middleware now always runs after startup has completed.
- If your plugin uses asgi_wrapper to start background tasks on the first incoming request, you should migrate to datasette.add_background_task() instead. datasette-cron and datasette-enrichments are being migrated to this pattern.
Other features
- New POST count endpoint for counting filtered table rows, now used by the count all button. (#2914)
- Datasette now uses httpx2, the Pydantic-maintained continuation of httpx, in place of
httpx. The public API is the same, but responses returned by datasette.client are nowhttpx2.Responseobjects rather thanhttpx.Response. Plugins that useisinstance()checks againsthttpx.Responseshould be updated to usehttpx2. Plugins that use httpx without explicitly depending on it will need to add an explicit dependency or switch to httpx2.
Bug fixes
- Column facets now show the remove-filter link for filters using
column__exact=value, as well ascolumn=value. (#1695) - The alter-table API now rolls back schema changes when a write_wrapper raises after the write. (#2924, #2925)
- The extra_template_vars() plugin hook can now return a function or awaitable that resolves to
Nonewhen no extra variables are needed. (#2005) - request.headers now supports case-insensitive header lookups, so
request.headers.get("Content-Type")works as well asrequest.headers.get("content-type"). (#1861) - CSV endpoints now return plain-text error messages for SQL errors. (#2129)
- The render_cell() plugin hook now receives an empty
pkslist when rendering SQL views in HTML, matching the JSON?_extra=render_cellbehavior. (#2639) - Numeric comparison filters now correctly handle decimal values, negative numbers and scientific notation when filtering computed columns and SQL views. Thanks, Rami Abdelrazzaq. (#1681, #2876)
- Fixed CSV streaming with
?_stream=onon SQL views repeating the second page of results until the CSV size limit was reached. Thanks, Ankita Advitot. (#2902, #2903)
datasette 0.65.5
- Fixed a security issue where a trailing newline in a requested table name could bypass table permissions and expose private rows. Thanks for the report, dpfkdlemtp. GHSA-h547-rmjf-5m2m
13th September 2026
shot-scraper 1.12 - A CLI utility for taking screenshots of websites, recording video demos and scraping sites using JavaScript
- WebP support, including different quality settings e.g.
shot-scraper http://www.example.com/ -o shot.webp --quality 80. WebP filesizes should be significantly smaller than both JPEG and PNG for many web pages. #209 - Fix local file URI handling for WebKit. Thanks, Xi Qin. #208
12th September 2026
datasette-sqlite-http 0.1.2
sqlite-http v0.1.2
- Improved release assets using https://github.com/asg017/sqlite-dist
- Fix for https://github.com/asg017/sqlite-http/issues/35 , thank you @ephraimstevens!