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 46 tools and 156 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.

New: Datasette Desktop - 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

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.

23rd February 2023 #

Using Datasette in GitHub Codespaces is a new tutorial showing how Datasette can be run in GitHub's free Codespaces browser-based development environments, using the new datasette-codespaces plugin.

28th January 2023 #

Examples of sites built using Datasette now includes screenshots of Datasette deployments that illustrate a variety of problems that can be addressed using Datasette and its plugins.

All news

Latest releases

17th February 2025

llm 0.22 - A CLI utility and Python library for interacting with Large Language Models, including OpenAI, PaLM and local models installed on your own machine.

See also LLM 0.22, the annotated release notes.

  • Plugins that provide models that use API keys can now subclass the new llm.KeyModel and llm.AsyncKeyModel classes. This results in the API key being passed as a new key parameter to their .execute() methods, and means that Python users can pass a key as the model.prompt(..., key=) - see Passing an API key. Plugin developers should consult the new documentation on writing Models that accept API keys. #744
  • New OpenAI model: chatgpt-4o-latest. This model ID accesses the current model being used to power ChatGPT, which can change without warning. #752
  • New llm logs -s/--short flag, which returns a greatly shortened version of the matching log entries in YAML format with a truncated prompt and without including the response. #737
  • Both llm models and llm embed-models now take multiple -q search fragments. You can now search for all models matching "gemini" and "exp" using llm models -q gemini -q exp. #748
  • New llm embed-multi --prepend X option for prepending a string to each value before it is embedded - useful for models such as nomic-embed-text-v2-moe that require passages to start with a string like "search_document: ". #745
  • The response.json() and response.usage() methods are now documented.
  • Fixed a bug where conversations that were loaded from the database could not be continued using asyncio prompts. #742
  • New plugin for macOS users: llm-mlx, which provides extremely high performance access to a wide range of local models using Apple's MLX framework.
  • The llm-claude-3 plugin has been renamed to llm-anthropic.

14th February 2025

datasette-public 0.3a1 - Make specific Datasette tables visible to the public

  • Changes are now recorded to a public_audit_log table, which is visible on the table and database permission editing pages. #11

13th February 2025

shot-scraper 1.6 - A command-line utility for taking automated screenshots of websites

6th February 2025

datasette-public 0.3a0 - Make specific Datasette tables visible to the public

  • Added the ability to make full databases public, including setting if users can execute SQL or not. #9
  • Now depends on Datasette 1.0a and uses the new internal database. #6

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

  • DATASETTE_SSL_KEYFILE and DATASETTE_SSL_CERTFILE environment variables as alternatives to --ssl-keyfile and --ssl-certfile. Thanks, Alex Garcia. (#2422)
  • SQLITE_EXTENSIONS environment variable has been renamed to DATASETTE_LOAD_EXTENSION. (#2424)
  • datasette serve environment variables are now documented here.
  • The register_magic_parameters(datasette) plugin hook can now register async functions. (#2441)
  • Datasette is now tested against Python 3.13.
  • Breadcrumbs on database and table pages now include a consistent self-link for resetting query string parameters. (#2454)
  • Fixed issue where Datasette could crash on metadata.json with nested values. (#2455)
  • New internal methods datasette.set_actor_cookie() and datasette.delete_actor_cookie(), described here. (#1690)
  • /-/permissions page now shows a list of all permissions registered by plugins. (#1943)
  • If a table has a single unique text column Datasette now detects that as the foreign key label for that table. (#2458)
  • The /-/permissions page now includes options for filtering or exclude permission checks recorded against the current user. (#2460)
  • Fixed a bug where replacing a database with a new one with the same name did not pick up the new database correctly. (#2465)

31st January 2025

llm 0.21 - A CLI utility and Python library for interacting with Large Language Models, including OpenAI, PaLM and local models installed on your own machine.

  • New model: o3-mini. #728
  • The o3-mini and o1 models now support a reasoning_effort option which can be set to low, medium or high.
  • llm prompt and llm logs now have a --xl/--extract-last option for extracting the last fenced code block in the response - a complement to the existing --x/--extract option. #717

23rd January 2025

llm 0.20

  • New model, o1. This model does not yet support streaming. #676
  • o1-preview and o1-mini models now support streaming.
  • New models, gpt-4o-audio-preview and gpt-4o-mini-audio-preview. #677
  • llm prompt -x/--extract option, which returns just the content of the first fenced code block in the response. Try llm prompt -x 'Python function to reverse a string'. #681
  • Creating a template using llm ... --save x now supports the -x/--extract option, which is saved to the template. YAML templates can set this option using extract: true.
  • New llm logs -x/--extract option extracts the first fenced code block from matching logged responses.
  • New llm models -q 'search' option returning models that case-insensitively match the search query. #700
  • Installation documentation now also includes uv. Thanks, Ariel Marcus. #690 and #702
  • llm models command now shows the current default model at the bottom of the listing. Thanks, Amjith Ramanujam. #688
  • Plugin directory now includes llm-venice, llm-bedrock, llm-deepseek and llm-cmd-comp.
  • Fixed bug where some dependency version combinations could cause a Client.__init__() got an unexpected keyword argument 'proxies' error. #709
  • OpenAI embedding models are now available using their full names of text-embedding-ada-002, text-embedding-3-small and text-embedding-3-large - the previous names are still supported as aliases. Thanks, web-sst. #654

15th January 2025

datasette-enrichments 0.5 - Tools for running enrichments against data stored in Datasette

  • UI for viewing status of enrichment jobs. #51
  • Pause, resume and cancel buttons. #17
  • Visible progress bar on table with running enrichments. #52
  • Table and database action menu items for viewing enrichment runs. #53
  • Enrichments continue running after a server restart. #54
  • An enrichment permission is now correctly registered with Datasette 1.0a+. #55
  • Enrichments can pause or cancel themselves by raising the new self.Pause(reason) and self.Cancel(reason) exceptions. #56

datasette-enrichments 0.5a1

  • Pause, resume, cancel buttons for jobs. #17
  • Enrichments can raise self.Pause("message") or self.Cancel("message") exceptions inside their enrich_batch() methods. #56

14th January 2025

datasette-enrichments 0.5a0

  • New /-/enrich/databasename/-/jobs listing page /-/enrich/databasename/-/jobs/123 detail page. #51
  • Visible progress bar on tables that have enrichments running. #52
  • Table and database action menu items to view previous runs. #53
  • Continue any enrichment runs after a server restart. #54

datasette-write-ui 0.0.1a12

5th December 2024

llm 0.19.1 - A CLI utility and Python library for interacting with Large Language Models, including OpenAI, PaLM and local models installed on your own machine.

  • FIxed bug where llm.get_models() and llm.get_async_models() returned the same model multiple times. #667

1st December 2024

llm 0.19

  • Tokens used by a response are now logged to new input_tokens and output_tokens integer columns and a token_details JSON string column, for the default OpenAI models and models from other plugins that implement this feature. #610
  • llm prompt now takes a -u/--usage flag to display token usage at the end of the response.
  • llm logs -u/--usage shows token usage information for logged responses.
  • llm prompt ... --async responses are now logged to the database. #641
  • llm.get_models() and llm.get_async_models() functions, documented here. #640
  • response.usage() and async response await response.usage() methods, returning a Usage(input=2, output=1, details=None) dataclass. #644
  • response.on_done(callback) and await response.on_done(callback) methods for specifying a callback to be executed when a response has completed, documented here. #653
  • Fix for bug running llm chat on Windows 11. Thanks, Sukhbinder Singh. #495

29th November 2024

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

  • Fixed bug with upgraded HTTPX 0.28.0 dependency. #2443

23rd November 2024

sqlite-utils 3.38 - CLI tool and Python library for manipulating SQLite databases

  • Plugins can now reuse the implementation of the sqlite-utils memory CLI command with the new return_db=True parameter. (#643)
  • table.transform() now recreates indexes after transforming a table. A new sqlite_utils.db.TransformError exception is raised if these indexes cannot be recreated due to conflicting changes to the table such as a column rename. Thanks, Mat Miller. (#633)
  • table.search() now accepts a include_rank=True parameter, causing the resulting rows to have a rank column showing the calculated relevance score. Thanks, liunux4odoo. (#628)
  • Fixed an error that occurred when creating a strict table with at least one floating point column. These FLOAT columns are now correctly created as REAL as well, but only for strict tables. (#644)

All releases