Skip to content

Instantly share code, notes, and snippets.

@simonw
Created March 10, 2022 22:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save simonw/431e9075441463236850bab042b9d20d to your computer and use it in GitHub Desktop.
Save simonw/431e9075441463236850bab042b9d20d to your computer and use it in GitHub Desktop.
{
"role": "WebArea",
"name": "Datasette: An open source multi-tool for exploring and publishing data",
"children": [
{
"role": "link",
"name": "Uses"
},
{
"role": "link",
"name": "Documentation"
},
{
"role": "link",
"name": "Tutorials"
},
{
"role": "link",
"name": "Examples"
},
{
"role": "link",
"name": "Plugins"
},
{
"role": "link",
"name": "Tools"
},
{
"role": "link",
"name": "News"
},
{
"role": "heading",
"name": "Datasette",
"level": 1
},
{
"role": "text",
"name": "An open source multi-tool for exploring and publishing data"
},
{
"role": "link",
"name": "PyPI"
},
{
"role": "link",
"name": "Changelog"
},
{
"role": "link",
"name": "Python 3.x"
},
{
"role": "link",
"name": "License"
},
{
"role": "textbox",
"name": "Search documentation, plugins, site news and releases"
},
{
"role": "button",
"name": "Search"
},
{
"role": "button",
"name": "Play: Introduction to Datasette and sqlite-utils"
},
{
"role": "link",
"name": "Annotated version"
},
{
"role": "text",
"name": "of this introductory video"
},
{
"role": "text",
"name": "Datasette is a tool for exploring and publishing data. It helps people take data of any shape or size, analyze and explore it, and publish it as an interactive website and accompanying API."
},
{
"role": "text",
"name": "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"
},
{
"role": "link",
"name": "tools"
},
{
"role": "text",
"name": "and"
},
{
"role": "link",
"name": "plugins"
},
{
"role": "text",
"name": "dedicated to making working with structured data as productive as possible."
},
{
"role": "link",
"name": "Try a demo"
},
{
"role": "text",
"name": "and explore 33,000 power plants around the world, then"
},
{
"role": "link",
"name": "follow the tutorial"
},
{
"role": "text",
"name": "or take a look at"
},
{
"role": "link",
"name": "some other examples"
},
{
"role": "text",
"name": "of Datasette in action."
},
{
"role": "text",
"name": "Then read how to"
},
{
"role": "link",
"name": "get started with Datasette"
},
{
"role": "text",
"name": ", subscribe to"
},
{
"role": "link",
"name": "the monthly-ish newsletter"
},
{
"role": "text",
"name": "and consider"
},
{
"role": "link",
"name": "signing up for office hours"
},
{
"role": "text",
"name": "for an in-person conversation about the project."
},
{
"role": "text",
"name": "New:"
},
{
"role": "link",
"name": "Datasette Desktop"
},
{
"role": "text",
"name": "- a macOS desktop application for easily running Datasette on your own computer!"
},
{
"role": "link",
"name": "Exploratory data analysis"
},
{
"role": "text",
"name": "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."
},
{
"role": "link",
"name": "Instant data publishing"
},
{
"role": "text",
"name": "datasette publish"
},
{
"role": "text",
"name": "lets you instantly publish your data to hosting providers like Google Cloud Run, Heroku or Vercel."
},
{
"role": "link",
"name": "Rapid prototyping"
},
{
"role": "text",
"name": "Spin up a JSON API for any data in minutes. Use it to prototype and prove your ideas without building a custom backend."
},
{
"role": "text",
"name": "Latest news"
},
{
"role": "link",
"name": "Atom feed"
},
{
"role": "text",
"name": "27th February 2022"
},
{
"role": "link",
"name": "#"
},
{
"role": "text",
"name": "The first two of an ongoing series of official Datasette tutorials are now available:"
},
{
"role": "link",
"name": "Exploring a database with Datasette"
},
{
"role": "text",
"name": "introduces the Datasette web interface and shows how it can be used to explore a new database, and"
},
{
"role": "link",
"name": "Learn SQL with Datasette"
},
{
"role": "text",
"name": "provides an introduction to SQL using Datasette as a learning environment."
},
{
"role": "text",
"name": "13th January 2022"
},
{
"role": "link",
"name": "#"
},
{
"role": "link",
"name": "Datasette 0.60"
},
{
"role": "text",
"name": "adds a new"
},
{
"role": "text",
"name": "filters_from_request"
},
{
"role": "text",
"name": "plugin hook, new internal methods for writing to the database, better performance and various faceting improvements. See also"
},
{
"role": "link",
"name": "the annotated release notes"
},
{
"role": "text",
"name": "."
},
{
"role": "text",
"name": "5th December 2021"
},
{
"role": "link",
"name": "#"
},
{
"role": "link",
"name": "Observable"
},
{
"role": "text",
"name": "notebooks recently added a SQL cell type, allowing SQL queries to be executed as part of an interactive notebook workflow. Alex Garcia built a"
},
{
"role": "link",
"name": "Datasette Client"
},
{
"role": "text",
"name": "for these which allows you to excute queries against any Datasette instance and explore and visualize the results using JavaScript code running in a notebook."
},
{
"role": "text",
"name": "14th October 2021"
},
{
"role": "link",
"name": "#"
},
{
"role": "link",
"name": "Datasette 0.59"
},
{
"role": "text",
"name": "adds column descriptions in metadata, a new"
},
{
"role": "text",
"name": "register_command"
},
{
"role": "text",
"name": "plugin hook, enhanced"
},
{
"role": "text",
"name": "--cors"
},
{
"role": "text",
"name": "support and a bunch of other fixes and documentation improvements. See also"
},
{
"role": "link",
"name": "the annotated release notes"
},
{
"role": "text",
"name": "."
},
{
"role": "text",
"name": "8th September 2021"
},
{
"role": "link",
"name": "#"
},
{
"role": "link",
"name": "Datasette Desktop"
},
{
"role": "text",
"name": "is a new macOS desktop application version of Datasette, which supports opening SQLite files on your computer, importing CSV files and installing plugins. I wrote more about how it works in"
},
{
"role": "link",
"name": "Datasette Desktop\u2014a macOS desktop application for Datasette"
},
{
"role": "text",
"name": "."
},
{
"role": "text",
"name": "28th July 2021"
},
{
"role": "link",
"name": "#"
},
{
"role": "link",
"name": "The Baked Data architectural pattern"
},
{
"role": "text",
"name": "describes a pattern commonly used with Datasette where the content for a site is bundled inside a SQLite database file and included alongside templates and application code in a deployment to a serverless hosting provider."
},
{
"role": "text",
"name": "15th July 2021"
},
{
"role": "link",
"name": "#"
},
{
"role": "link",
"name": "Datasette 0.58"
},
{
"role": "text",
"name": "has new plugin hooks, a huge performance improvement for faceting, support for Unix domain sockets and several other improvements. Read"
},
{
"role": "link",
"name": "the annotated release notes"
},
{
"role": "text",
"name": "for extra background and context on the release."
},
{
"role": "text",
"name": "5th June 2021"
},
{
"role": "link",
"name": "#"
},
{
"role": "link",
"name": "Datasette 0.57"
},
{
"role": "text",
"name": "is out with an important"
},
{
"role": "link",
"name": "security patch"
},
{
"role": "text",
"name": "plus a number of new features and bug fixes. Datasette 0.56.1, also out today, provides the security patch for users who are not yet ready to upgrade to the latest version."
},
{
"role": "text",
"name": "10th May 2021"
},
{
"role": "link",
"name": "#"
},
{
"role": "link",
"name": "Django SQL Dashboard"
},
{
"role": "text",
"name": "is a new tool that brings a useful authenticated subset of Datasette to Django projects that are built on top of PostgreSQL."
},
{
"role": "text",
"name": "28th March 2021"
},
{
"role": "link",
"name": "#"
},
{
"role": "link",
"name": "Datasette 0.56"
},
{
"role": "text",
"name": "has bug fixes and documentation improvements, plus some new documented internal APIs for plugin authors and SpatiaLite 5 bundled with the official"
},
{
"role": "link",
"name": "Datasette Docker container"
},
{
"role": "text",
"name": "."
},
{
"role": "text",
"name": "18th February 2021"
},
{
"role": "link",
"name": "#"
},
{
"role": "link",
"name": "Datasette 0.55"
},
{
"role": "text",
"name": "adds support for cross-database SQL queries. You can now run"
},
{
"role": "text",
"name": "datasette --crossdb one.db two.db"
},
{
"role": "text",
"name": "and then run queries that join data from tables in both of those database files - see"
},
{
"role": "link",
"name": "cross-database queries"
},
{
"role": "text",
"name": "in the documentation for more details."
},
{
"role": "link",
"name": "sqlite-utils 3.6"
},
{
"role": "text",
"name": "adds similar features: a"
},
{
"role": "text",
"name": "db.attach(alias, filepath)"
},
{
"role": "text",
"name": "Python API method and"
},
{
"role": "text",
"name": "--attach alias filepath.db"
},
{
"role": "text",
"name": "command-line option, both for attaching additional databases in order to execute cross-database queries."
},
{
"role": "text",
"name": "7th February 2021"
},
{
"role": "link",
"name": "#"
},
{
"role": "text",
"name": "This new"
},
{
"role": "link",
"name": "Video introduction to Datasette and sqlite-utils"
},
{
"role": "text",
"name": "provides a full introduction to both Datasette and"
},
{
"role": "link",
"name": "sqlite-utils"
},
{
"role": "text",
"name": "in 17 minutes, including a live demo of creating a database from a CSV file and publishing it to Google Cloud Run."
},
{
"role": "text",
"name": "3rd February 2021"
},
{
"role": "link",
"name": "#"
},
{
"role": "link",
"name": "Serving map tiles from SQLite with MBTiles and datasette-tiles"
},
{
"role": "text",
"name": "."
},
{
"role": "link",
"name": "datasette-tiles"
},
{
"role": "text",
"name": "is a new plugin that adds a tile server to Datasette, serving map tiles from databases that conform to"
},
{
"role": "link",
"name": "the MBTiles specification"
},
{
"role": "text",
"name": "."
},
{
"role": "link",
"name": "download-tiles"
},
{
"role": "text",
"name": "is a tool for building these databases, and"
},
{
"role": "link",
"name": "datasette-basemap"
},
{
"role": "text",
"name": "is a plugin that bundles a 22MB SQLite database with OpenStreetMap tiles covering zoom levels 0-6 for the entire world."
},
{
"role": "text",
"name": "25th January 2021"
},
{
"role": "link",
"name": "#"
},
{
"role": "link",
"name": "Datasette 0.54"
},
{
"role": "text",
"name": "is out today. Highlights include the new"
},
{
"role": "text",
"name": "_internal"
},
{
"role": "text",
"name": "in-memory database exposing details of connected tables, plus support for JavaScript modules in plugins and add-on scripts. More commentary on this release is available in the"
},
{
"role": "link",
"name": "annotated release notes"
},
{
"role": "text",
"name": "."
},
{
"role": "text",
"name": "24th January 2021"
},
{
"role": "link",
"name": "#"
},
{
"role": "link",
"name": "Drawing shapes on a map to query a SpatiaLite database"
},
{
"role": "text",
"name": "introduces the new"
},
{
"role": "link",
"name": "datasette-leaflet-freedraw"
},
{
"role": "text",
"name": "plugin, which adds support for drawing shapes on a map to specify a GeoJSON MultiPolygon that can be used to query SpatiaLite databases."
},
{
"role": "link",
"name": "All news"
},
{
"role": "heading",
"name": "Latest releases",
"level": 2
},
{
"role": "heading",
"name": "8th March 2022",
"level": 3
},
{
"role": "link",
"name": "django-sql-dashboard 1.0.2"
},
{
"role": "text",
"name": "Fixed a bug where queries that returned an array containing dates (or other objects without a defined Python JSON serialization) would result in a 500 error."
},
{
"role": "link",
"name": "#146"
},
{
"role": "heading",
"name": "4th March 2022",
"level": 3
},
{
"role": "link",
"name": "geojson-to-sqlite 1.0"
},
{
"role": "text",
"name": "New"
},
{
"role": "text",
"name": "--properties"
},
{
"role": "text",
"name": "option for writing GeoJSON properties to a JSON column called"
},
{
"role": "text",
"name": "properties"
},
{
"role": "text",
"name": "- or use"
},
{
"role": "text",
"name": "--properties=props"
},
{
"role": "text",
"name": "to write to a column called"
},
{
"role": "text",
"name": "props"
},
{
"role": "text",
"name": ". Thanks,"
},
{
"role": "link",
"name": "Chris Amico"
},
{
"role": "text",
"name": "."
},
{
"role": "link",
"name": "#25"
},
{
"role": "heading",
"name": "2nd March 2022",
"level": 3
},
{
"role": "link",
"name": "sqlite-utils 3.25"
},
{
"role": "text",
"name": "New"
},
{
"role": "text",
"name": "hash_id_columns="
},
{
"role": "text",
"name": "parameter for creating a primary key that's a hash of the content of specific columns - see"
},
{
"role": "link",
"name": "Setting an ID based on the hash of the row contents"
},
{
"role": "text",
"name": "for details. ("
},
{
"role": "link",
"name": "#343"
},
{
"role": "text",
"name": ")"
},
{
"role": "text",
"name": "New"
},
{
"role": "link",
"name": "db.sqlite_version"
},
{
"role": "text",
"name": "property, returning a tuple of integers representing the version of SQLite, for example"
},
{
"role": "text",
"name": "(3, 38, 0)"
},
{
"role": "text",
"name": "."
},
{
"role": "text",
"name": "Fixed a bug where"
},
{
"role": "link",
"name": "register_function(deterministic=True)"
},
{
"role": "text",
"name": "caused errors on versions of SQLite prior to 3.8.3. ("
},
{
"role": "link",
"name": "#408"
},
{
"role": "text",
"name": ")"
},
{
"role": "text",
"name": "New documented"
},
{
"role": "link",
"name": "hash_record(record, keys=...)"
},
{
"role": "text",
"name": "function."
},
{
"role": "link",
"name": "sqlite-colorbrewer v0.2.0"
},
{
"role": "text",
"name": "Mark function as deterministic on Python 3.8 or later."
},
{
"role": "heading",
"name": "1st March 2022",
"level": 3
},
{
"role": "link",
"name": "geocode-sqlite v0.5.2"
},
{
"role": "heading",
"name": "What's Changed",
"level": 5
},
{
"role": "text",
"name": "Require click >= 7.0 to hide commands by @1-Byte in"
},
{
"role": "link",
"name": "https://github.com/eyeseast/geocode-sqlite/pull/20"
},
{
"role": "text",
"name": "Fix error with rowid tables by @eyeseast in"
},
{
"role": "link",
"name": "https://github.com/eyeseast/geocode-sqlite/pull/27"
},
{
"role": "text",
"name": "Full Changelog"
},
{
"role": "text",
"name": ":"
},
{
"role": "link",
"name": "https://github.com/eyeseast/geocode-sqlite/compare/v0.5.1...v0.5.2"
},
{
"role": "link",
"name": "datasette-dateutil 0.3"
},
{
"role": "text",
"name": "The"
},
{
"role": "text",
"name": "dateutil_parse()"
},
{
"role": "text",
"name": ","
},
{
"role": "text",
"name": "dateutil_parse_fuzzy()"
},
{
"role": "text",
"name": ","
},
{
"role": "text",
"name": "dateutil_parse_dayfirst()"
},
{
"role": "text",
"name": "and"
},
{
"role": "text",
"name": "dateutil_parse_fuzzy_dayfirst()"
},
{
"role": "text",
"name": "functions all now accept an optional second argument specifying a \"default\" datetime to consider if some of the details are missing."
},
{
"role": "link",
"name": "#5"
},
{
"role": "heading",
"name": "26th February 2022",
"level": 3
},
{
"role": "link",
"name": "datasette-render-markdown 2.1"
},
{
"role": "text",
"name": "Fixed bug where potential URLs inside of"
},
{
"role": "text",
"name": "<pre>"
},
{
"role": "text",
"name": "links were being turned into links."
},
{
"role": "link",
"name": "#11"
},
{
"role": "heading",
"name": "23rd February 2022",
"level": 3
},
{
"role": "link",
"name": "datasette-redirect-forbidden 0.1"
},
{
"role": "text",
"name": "Initial release."
},
{
"role": "link",
"name": "#1"
},
{
"role": "heading",
"name": "21st February 2022",
"level": 3
},
{
"role": "link",
"name": "sqlite-diffable 0.2.1"
},
{
"role": "text",
"name": "README now includes a description of the file format and a link to a demo."
},
{
"role": "link",
"name": "#5"
},
{
"role": "heading",
"name": "20th February 2022",
"level": 3
},
{
"role": "link",
"name": "google-drive-to-sqlite 0.4"
},
{
"role": "text",
"name": "Redesigned"
},
{
"role": "link",
"name": "the schema"
},
{
"role": "text",
"name": "to reflect that Google Drive files can only have one, not multiple owners."
},
{
"role": "link",
"name": "#34"
},
{
"role": "text",
"name": "Removed"
},
{
"role": "text",
"name": "drive_folders_owners"
},
{
"role": "text",
"name": "and"
},
{
"role": "text",
"name": "drive_files_owners"
},
{
"role": "text",
"name": "tables."
},
{
"role": "text",
"name": "drive_files"
},
{
"role": "text",
"name": "and"
},
{
"role": "text",
"name": "drive_folders"
},
{
"role": "text",
"name": "now have a"
},
{
"role": "text",
"name": "_owner"
},
{
"role": "text",
"name": "column that is a foreign key to"
},
{
"role": "text",
"name": "drive_users"
},
{
"role": "text",
"name": "."
},
{
"role": "text",
"name": "New"
},
{
"role": "link",
"name": "google-drive-to-sqlite export format file_id"
},
{
"role": "text",
"name": "command for exporting Google Docs files as different formats such as"
},
{
"role": "text",
"name": "pdf"
},
{
"role": "text",
"name": "."
},
{
"role": "link",
"name": "#21"
},
{
"role": "text",
"name": "New options to"
},
{
"role": "text",
"name": "files"
},
{
"role": "text",
"name": ":"
},
{
"role": "text",
"name": "--apps"
},
{
"role": "text",
"name": "for all Google Docs files of all types, or"
},
{
"role": "text",
"name": "--docs"
},
{
"role": "text",
"name": ","
},
{
"role": "text",
"name": "--sheets"
},
{
"role": "text",
"name": ","
},
{
"role": "text",
"name": "--presentations"
},
{
"role": "text",
"name": "and"
},
{
"role": "text",
"name": "--drawings"
},
{
"role": "text",
"name": "for Google Docs files of specific types."
},
{
"role": "text",
"name": "google-drive-to-sqlite files"
},
{
"role": "text",
"name": "and"
},
{
"role": "text",
"name": "get"
},
{
"role": "text",
"name": "commands now have a"
},
{
"role": "text",
"name": "--verbose"
},
{
"role": "text",
"name": "option showing what the tool is doing in detail."
},
{
"role": "text",
"name": "Automatically retries up to twice on HTTP transport errors, with a 2 second delay."
},
{
"role": "link",
"name": "#18"
},
{
"role": "text",
"name": "The"
},
{
"role": "text",
"name": "auth.json"
},
{
"role": "text",
"name": "file now defaults to"
},
{
"role": "text",
"name": "0600"
},
{
"role": "text",
"name": "permissions, meaning only the user can read that file on a shared system."
},
{
"role": "link",
"name": "#37"
},
{
"role": "link",
"name": "All releases"
},
{
"role": "text",
"name": "Powered by"
},
{
"role": "link",
"name": "Datasette",
"description": "Datasette v0.60.2"
},
{
"role": "text",
"name": "\u00b7"
},
{
"role": "link",
"name": "How this site works"
},
{
"role": "text",
"name": "\u00b7"
},
{
"role": "link",
"name": "Code of conduct"
},
{
"role": "link",
"name": "datasette on GitHub"
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment