{"html_url": "https://github.com/simonw/datasette/releases/tag/0.46", "id": 29489364, "node_id": "MDc6UmVsZWFzZTI5NDg5MzY0", "tag_name": "0.46", "target_commitish": "main", "name": "0.46", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-08-09T16:09:07Z", "published_at": "2020-08-09T16:10:47Z", "body": "**Warning:** This release contains a security fix related to authenticated writable canned queries. If you are using this feature you should upgrade as soon as possible.\r\n\r\n- **Security fix:** CSRF tokens were incorrectly included in read-only canned query forms, which could allow them to be leaked to a sophisticated attacker. See [issue 918](https://github.com/simonw/datasette/issues/918) for details.\r\n- Datasette now supports GraphQL via the new [datasette-graphql](https://github.com/simonw/datasette-graphql) plugin - see [GraphQL in Datasette with the new datasette-graphql plugin](https://simonwillison.net/2020/Aug/7/datasette-graphql/).\r\n- Principle git branch has been renamed from `master` to `main`. ([#849](https://github.com/simonw/datasette/issues/849))\r\n- New debugging tool: `/-/allow-debug tool` ([demo here](https://latest.datasette.io/-/allow-debug)) helps test allow blocks against actors, as described in [Defining permissions with \"allow\" blocks](https://datasette.readthedocs.io/en/stable/authentication.html#authentication-permissions-allow). ([#908](https://github.com/simonw/datasette/issues/908))\r\n- New logo for the documentation, and a new project tagline: \"An open source multi-tool for exploring and publishing data\".\r\n- Whitespace in column values is now respected on display, using `white-space: pre-wrap`. ([#896](https://github.com/simonw/datasette/issues/896))\r\n- New `await request.post_body()` method for accessing the raw POST body, see [Request object](https://datasette.readthedocs.io/en/stable/internals.html#internals-request). ([#897](https://github.com/simonw/datasette/issues/897))\r\n- Database file downloads now include a `content-length` HTTP header, enabling download progress bars. ([#905](https://github.com/simonw/datasette/issues/905))\r\n- File downloads now also correctly set the suggested file name using a `content-disposition` HTTP header. ([#909](https://github.com/simonw/datasette/issues/909))\r\n- `tests` are now excluded from the Datasette package properly - thanks, abeyerpath. ([#456](https://github.com/simonw/datasette/issues/456))\r\n- The Datasette package published to PyPI now includes `sdist` as well as `bdist_wheel`.\r\n- Better titles for canned query pages. ([#887](https://github.com/simonw/datasette/issues/887))\r\n- Now only loads Python files from a directory passed using the `--plugins-dir` option - thanks, Amjith Ramanujam. ([#890](https://github.com/simonw/datasette/pull/890))\r\n- New documentation section on [Publishing to Vercel](https://datasette.readthedocs.io/en/stable/publish.html#publish-vercel).", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.47", "id": 29585154, "node_id": "MDc6UmVsZWFzZTI5NTg1MTU0", "tag_name": "0.47", "target_commitish": "main", "name": "0.47", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-08-12T00:42:47Z", "published_at": "2020-08-12T00:44:52Z", "body": "- Datasette now has [a GitHub discussions forum](https://github.com/simonw/datasette/discussions) for conversations about the project that go beyond just bug reports and issues.\r\n- Datasette can now be installed on macOS using Homebrew! Run `brew install simonw/datasette/datasette`. See [Using Homebrew](https://datasette.readthedocs.io/en/stable/installation.html#installation-homebrew). ([#335](https://github.com/simonw/datasette/issues/335))\r\n- Two new commands: `datasette install name-of-plugin` and `datasette uninstall name-of-plugin`. These are equivalent to `pip install` and `pip uninstall` but automatically run in the same virtual environment as Datasette, so users don't have to figure out where that virtual environment is - useful for installations created using Homebrew or `pipx`. See [Installing plugins](https://datasette.readthedocs.io/en/stable/plugins.html#plugins-installing). ([#925](https://github.com/simonw/datasette/issues/925))\r\n- A new command-line option, `datasette --get`, accepts a path to a URL within the Datasette instance. It will run that request through Datasette (without starting a web server) and print out the repsonse. See [datasette --get](https://datasette.readthedocs.io/en/stable/getting_started.html#getting-started-datasette-get) for an example. ([#926](https://github.com/simonw/datasette/issues/926))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.47.1", "id": 29587652, "node_id": "MDc6UmVsZWFzZTI5NTg3NjUy", "tag_name": "0.47.1", "target_commitish": "main", "name": "0.47.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-08-12T02:37:24Z", "published_at": "2020-08-12T02:38:00Z", "body": "- Fixed a bug where the `sdist` distribution of Datasette was not correctly including the template files. ([#930](https://github.com/simonw/datasette/issues/930))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.47.2", "id": 29625082, "node_id": "MDc6UmVsZWFzZTI5NjI1MDgy", "tag_name": "0.47.2", "target_commitish": "main", "name": "0.47.2", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-08-12T20:54:33Z", "published_at": "2020-08-12T20:55:28Z", "body": "- Fixed an issue with the Docker image [published to Docker Hub](https://hub.docker.com/r/datasetteproject/datasette). ([#931](https://github.com/simonw/datasette/issues/931))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.47.3", "id": 29738457, "node_id": "MDc6UmVsZWFzZTI5NzM4NDU3", "tag_name": "0.47.3", "target_commitish": "main", "name": "0.47.3", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-08-15T20:56:08Z", "published_at": "2020-08-15T21:03:58Z", "body": "- The `datasette --get` command-line mechanism now ensures any plugins using the `startup()` hook are correctly executed. ([#934](https://github.com/simonw/datasette/issues/934))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.48", "id": 29749566, "node_id": "MDc6UmVsZWFzZTI5NzQ5NTY2", "tag_name": "0.48", "target_commitish": "main", "name": "0.48", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-08-16T18:56:31Z", "published_at": "2020-08-16T18:58:34Z", "body": "- Datasette documentation now lives at [docs.datasette.io](https://docs.datasette.io/).\r\n- `db.is_mutable` property is now documented and tested, see [Database introspection](https://docs.datasette.io/en/stable/internals.html#internals-database-introspection).\r\n- The `extra_template_vars`, `extra_css_urls`, `extra_js_urls` and `extra_body_script` plugin hooks now all accept the same arguments. See [extra_template_vars(template, database, table, columns, view_name, request, datasette)](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-extra-template-vars) for details. ([#939](https://github.com/simonw/datasette/issues/939))\r\n- Those hooks now accept a new `columns` argument detailing the table columns that will be rendered on that page. ([#938](https://github.com/simonw/datasette/issues/938))\r\n- Fixed bug where plugins calling `db.execute_write_fn()` could hang Datasette if the connection failed. ([#935](https://github.com/simonw/datasette/issues/935))\r\n- Fixed bug with the `?_nl=on` output option and binary data. ([#914](https://github.com/simonw/datasette/issues/914))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.49", "id": 31288240, "node_id": "MDc6UmVsZWFzZTMxMjg4MjQw", "tag_name": "0.49", "target_commitish": "main", "name": "0.49", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-09-14T21:38:24Z", "published_at": "2020-09-14T21:40:11Z", "body": "- Writable canned queries now expose a JSON API, see [JSON API for writable canned queries](https://docs.datasette.io/en/stable/sql_queries.html#canned-queries-json-api). ([#880](https://github.com/simonw/datasette/issues/880))\r\n- New mechanism for defining page templates with custom path parameters - a template file called `pages/about/{slug}.html` will be used to render any requests to `/about/something`. See [Path parameters for pages](https://docs.datasette.io/en/stable/custom_templates.html#custom-pages-parameters). ([#944](https://github.com/simonw/datasette/issues/944))\r\n- `register_output_renderer()` render functions can now return a `Response`. ([#953](https://github.com/simonw/datasette/issues/953))\r\n- New `--upgrade` option for `datasette install`. ([#945](https://github.com/simonw/datasette/issues/945))\r\n- New `datasette --pdb` option. ([#962](https://github.com/simonw/datasette/issues/962))\r\n- `datasette --get` exit code now reflects the internal HTTP status code. ([#947](https://github.com/simonw/datasette/issues/947))\r\n- New `raise_404()` template function for returning 404 errors. ([#964](https://github.com/simonw/datasette/issues/964))\r\n- `datasette publish heroku` now deploys using Python 3.8.5\r\n- Upgraded [CodeMirror](https://codemirror.net/) to 5.57.0. ([#948](https://github.com/simonw/datasette/issues/948))\r\n- Upgraded code style to Black 20.8b1. ([#958](https://github.com/simonw/datasette/issues/958))\r\n- Fixed bug where selected facets were not correctly persisted in hidden form fields on the table page. ([#963](https://github.com/simonw/datasette/issues/963))\r\n- Renamed the default error template from `500.html` to `error.html`.\r\n- Custom error pages are now documented, see [Custom error pages](https://docs.datasette.io/en/stable/custom_templates.html#custom-pages-errors). ([#965](https://github.com/simonw/datasette/issues/965))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.49.1", "id": 31354944, "node_id": "MDc6UmVsZWFzZTMxMzU0OTQ0", "tag_name": "0.49.1", "target_commitish": "main", "name": "0.49.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-09-15T20:20:15Z", "published_at": "2020-09-15T20:21:16Z", "body": "- Fixed a bug with writable canned queries that use magic parameters but accept no non-magic arguments. (#967)\r\n", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.49a0", "id": 30353073, "node_id": "MDc6UmVsZWFzZTMwMzUzMDcz", "tag_name": "0.49a0", "target_commitish": "main", "name": "0.49a0", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 1, "created_at": "2020-08-28T23:12:47Z", "published_at": "2020-08-28T23:18:09Z", "body": "- `register_output_renderer()` render functions can now return a `Response`. ([#953](https://github.com/simonw/datasette/issues/953))\r\n- New `--upgrade` option for `datasette install`. ([#945](https://github.com/simonw/datasette/issues/945))\r\n- `datasette publish heroku` now deploys using Python 3.8.5", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.49a1", "id": 31227999, "node_id": "MDc6UmVsZWFzZTMxMjI3OTk5", "tag_name": "0.49a1", "target_commitish": "main", "name": "0.49a1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 1, "created_at": "2020-09-14T02:47:21Z", "published_at": "2020-09-14T02:48:19Z", "body": "- Upgraded [CodeMirror](https://codemirror.net/) to 5.57.0. ([#948](https://github.com/simonw/datasette/issues/948))\r\n- Upgraded code style to Black 20.8b1. ([#958](https://github.com/simonw/datasette/issues/958))\r\n- New `datasette --pdb` option. ([#962](https://github.com/simonw/datasette/issues/962))\r\n- `datasette --get` exit code now reflects the internal HTTP status code. ([#947](https://github.com/simonw/datasette/issues/947))\r\n- Fixed bug where selected facets were not correctly persisted in hidden form fields on the table page. ([#963](https://github.com/simonw/datasette/issues/963))\r\n- New mechanism for defining page templates with custom path parameters. ([#944](https://github.com/simonw/datasette/issues/944))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/dogsheep/dogsheep-beta/releases/tag/0.4a0", "id": 30632372, "node_id": "MDc6UmVsZWFzZTMwNjMyMzcy", "tag_name": "0.4a0", "target_commitish": "main", "name": "0.4a0", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 1, "created_at": "2020-09-03T03:53:29Z", "published_at": "2020-09-03T03:54:23Z", "body": "- Incomplete preview of the `/-/beta` search interface. #3 #9\r\n\r\n", "repo": {"value": 197431109, "label": "dogsheep-beta"}, "reactions": null} {"html_url": "https://github.com/dogsheep/dogsheep-beta/releases/tag/0.4a1", "id": 30678449, "node_id": "MDc6UmVsZWFzZTMwNjc4NDQ5", "tag_name": "0.4a1", "target_commitish": "main", "name": "0.4a1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 1, "created_at": "2020-09-03T18:03:15Z", "published_at": "2020-09-03T18:03:50Z", "body": "- Added `received` category. #10\r\n- New `is_public` column. #11", "repo": {"value": 197431109, "label": "dogsheep-beta"}, "reactions": null} {"html_url": "https://github.com/dogsheep/twitter-to-sqlite/releases/tag/0.5", "id": 19889174, "node_id": "MDc6UmVsZWFzZTE5ODg5MTc0", "tag_name": "0.5", "target_commitish": "master", "name": "0.5", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-09-10T17:38:46Z", "published_at": "2019-09-10T17:39:47Z", "body": "* Added `followers-ids` and `friends-ids` subcommands", "repo": {"value": 206156866, "label": "twitter-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/dogsheep/github-to-sqlite/releases/tag/0.5", "id": 20663605, "node_id": "MDc6UmVsZWFzZTIwNjYzNjA1", "tag_name": "0.5", "target_commitish": "master", "name": "0.5", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-10-13T05:28:24Z", "published_at": "2019-10-13T05:30:05Z", "body": "* New command: `github-to-sqlite issue-comments` for importing comments on issues - #7\r\n* `github-to-sqlite issues` now accepts optional `--issue=1` argument\r\n* Fixed bug inserting users into already-created table with wrong columns - #6", "repo": {"value": 207052882, "label": "github-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/dogsheep/healthkit-to-sqlite/releases/tag/0.5", "id": 24953710, "node_id": "MDc6UmVsZWFzZTI0OTUzNzEw", "tag_name": "0.5", "target_commitish": "master", "name": "0.5", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-03-28T01:50:51Z", "published_at": "2020-03-28T01:55:19Z", "body": "* Upgraded to latest sqlite-utils", "repo": {"value": 197882382, "label": "healthkit-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/dogsheep/dogsheep-beta/releases/tag/0.5", "id": 30699190, "node_id": "MDc6UmVsZWFzZTMwNjk5MTkw", "tag_name": "0.5", "target_commitish": "main", "name": "0.5", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-09-04T01:45:35Z", "published_at": "2020-09-04T01:46:16Z", "body": "- Custom template displays can now render a point on a map. #12", "repo": {"value": 197431109, "label": "dogsheep-beta"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.50", "id": 32384200, "node_id": "MDc6UmVsZWFzZTMyMzg0MjAw", "tag_name": "0.50", "target_commitish": "main", "name": "0.50", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-10-09T17:57:55Z", "published_at": "2020-10-09T17:58:27Z", "body": "The key new feature in this release is the **column actions** menu on the table page ([#891](https://github.com/simonw/datasette/issues/891)). This can be used to sort a column in ascending or descending order, facet data by that column or filter the table to just rows that have a value for that column.\r\n\r\nPlugin authors can use the new [datasette.client](https://docs.datasette.io/en/stable/internals.html#internals-datasette-client) object to make internal HTTP requests from their plugins, allowing them to make use of Datasette's JSON API. ([#943](https://github.com/simonw/datasette/issues/943))\r\n\r\nNew [Deploying Datasette](https://docs.datasette.io/en/stable/deploying.html#deploying) documentation with guides for deploying Datasette on a Linux server [using systemd](https://docs.datasette.io/en/stable/deploying.html#deploying-systemd) or to hosting providers [that support buildpacks](https://docs.datasette.io/en/stable/deploying.html#deploying-buildpacks). ([#514](https://github.com/simonw/datasette/issues/514), [#997](https://github.com/simonw/datasette/issues/997))\r\n\r\nOther improvements in this release:\r\n\r\n- [Publishing to Google Cloud Run](https://docs.datasette.io/en/stable/publish.html#publish-cloud-run) documentation now covers Google Cloud SDK options. Thanks, Geoffrey Hing. ([#995](https://github.com/simonw/datasette/pull/995))\r\n- New `datasette -o` option which opens your browser as soon as Datasette starts up. ([#970](https://github.com/simonw/datasette/issues/970))\r\n- Datasette now sets `sqlite3.enable_callback_tracebacks(True)` so that errors in custom SQL functions will display tracebacks. ([#891](https://github.com/simonw/datasette/issues/891))\r\n- Fixed two rendering bugs with column headers in portrait mobile view. ([#978](https://github.com/simonw/datasette/issues/978), [#980](https://github.com/simonw/datasette/issues/980))\r\n- New `db.table_column_details(table)` introspection method for retrieving full details of the columns in a specific table, see [Database introspection](https://docs.datasette.io/en/stable/internals.html#internals-database-introspection).\r\n- Fixed a routing bug with custom page wildcard templates. ([#996](https://github.com/simonw/datasette/issues/996))\r\n- `datasette publish heroku` now deploys using Python 3.8.6.\r\n- New `datasette publish heroku --tar=` option. ([#969](https://github.com/simonw/datasette/issues/969))\r\n- `OPTIONS` requests against HTML pages no longer return a 500 error. ([#1001](https://github.com/simonw/datasette/issues/1001))\r\n- Datasette now supports Python 3.9.", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.50.1", "id": 32395303, "node_id": "MDc6UmVsZWFzZTMyMzk1MzAz", "tag_name": "0.50.1", "target_commitish": "main", "name": "0.50.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-10-10T00:41:35Z", "published_at": "2020-10-10T00:44:23Z", "body": "- Fixed a bug introduced in 0.50 where the export as JSON/CSV links on the table, row and query pages were broken. (#1010)\r\n", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.50.2", "id": 32397338, "node_id": "MDc6UmVsZWFzZTMyMzk3MzM4", "tag_name": "0.50.2", "target_commitish": "main", "name": "0.50.2", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-10-10T03:53:47Z", "published_at": "2020-10-10T03:59:18Z", "body": "* Fixed another bug introduced in 0.50 where column header links on the table page were broken. (#1011)\r\n", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.50a0", "id": 32072114, "node_id": "MDc6UmVsZWFzZTMyMDcyMTE0", "tag_name": "0.50a0", "target_commitish": "main", "name": "0.50a0", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 1, "created_at": "2020-10-01T23:35:04Z", "published_at": "2020-10-01T23:35:54Z", "body": "- New column action menu - table columns now show a cog icon which provides a contextual menu for that column. ([#981](https://github.com/simonw/datasette/issues/981))\r\n- New `datasette -o` option which opens your browser as soon as Datasette starts up. ([#970](https://github.com/simonw/datasette/issues/970)\r\n- `sqlite3.enable_callback_tracebacks(True)` so errors in custom SQL functions will now display tracebacks. ([#891](https://github.com/simonw/datasette/issues/891))\r\n- Fixed two rendering bugs with column headers in portrait mobile view. ([#978](https://github.com/simonw/datasette/issues/978), [#980](https://github.com/simonw/datasette/issues/980))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.50a1", "id": 32238807, "node_id": "MDc6UmVsZWFzZTMyMjM4ODA3", "tag_name": "0.50a1", "target_commitish": "main", "name": "0.50a1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 1, "created_at": "2020-10-06T20:50:54Z", "published_at": "2020-10-06T20:52:49Z", "body": "- Column action menu now shows the column type. ([#993](https://github.com/simonw/datasette/issues/993))\r\n- Column action sort links now correctly link to the first page of sorted results. ([#989](https://github.com/simonw/datasette/issues/989))\r\n- [Publishing to Google Cloud Run](https://docs.datasette.io/en/latest/publish.html#publish-cloud-run) documentation now covers Google Cloud SDK options. Thanks, Geoffrey Hing. ([#995](https://github.com/simonw/datasette/pull/995))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.51", "id": 33311677, "node_id": "MDc6UmVsZWFzZTMzMzExNjc3", "tag_name": "0.51", "target_commitish": "main", "name": "0.51", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-10-31T22:24:54Z", "published_at": "2020-10-31T22:29:33Z", "body": "A new visual design, plugin hooks for adding navigation options, better handling of binary data, URL building utility methods and better support for running Datasette behind a proxy.\r\n\r\n### New visual design\r\n\r\nDatasette is no longer white and grey with blue and purple links! [Natalie Downe](https://twitter.com/natbat) has been working on a visual refresh, the first iteration of which is included in this release. ([#1056](https://github.com/simonw/datasette/pull/1056))\r\n\r\n![datasette-0 51](https://user-images.githubusercontent.com/9599/97791267-d9011e80-1b8d-11eb-9b1b-42908266f36f.png)\r\n\r\n### Plugins can now add links within Datasette\r\n\r\nA number of existing Datasette plugins add new pages to the Datasette interface, providig tools for things like [uploading CSVs](https://github.com/simonw/datasette-upload-csvs), [editing table schemas](https://github.com/simonw/datasette-edit-schema) or [configuring full-text search](https://github.com/simonw/datasette-configure-fts).\r\n\r\nPlugins like this can now link to themselves from other parts of Datasette interface. The [menu_links(datasette, actor)](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-menu-links) hook ([#1064](https://github.com/simonw/datasette/issues/1064)) lets plugins add links to Datasette's new top-right application menu, and the [table_actions(datasette, actor, database, table)](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-table-actions) hook ([#1066](https://github.com/simonw/datasette/issues/1066)) adds links to a new \"table actions\" menu on the table page.\r\n\r\nThe demo at [latest.datasette.io](https://latest.datasette.io/) now includes some example plugins. To see the new table actions menu first [sign into that demo as root](https://latest.datasette.io/login-as-root) and then visit the [facetable](https://latest.datasette.io/fixtures/facetable) table to see the new cog icon menu at the top of the page.\r\n\r\n### Binary data\r\n\r\nSQLite tables can contain binary data in `BLOB` columns. Datasette now provides links for users to download this data directly from Datasette, and uses those links to make binary data available from CSV exports. See [Binary data](https://docs.datasette.io/en/stable/binary_data.html#binary) for more details. ([#1036](https://github.com/simonw/datasette/issues/1036) and [#1034](https://github.com/simonw/datasette/issues/1034)).\r\n\r\n### URL building\r\n\r\nThe new [datasette.urls](https://docs.datasette.io/en/stable/internals.html#internals-datasette-urls) family of methods can be used to generate URLs to key pages within the Datasette interface, both within custom templates and Datasette plugins. See [Building URLs within plugins](https://docs.datasette.io/en/stable/writing_plugins.html#writing-plugins-building-urls) for more details. ([#904](https://github.com/simonw/datasette/issues/904))\r\n\r\n### Running Datasette behind a proxy\r\n\r\nThe [base_url](https://docs.datasette.io/en/stable/config.html#config-base-url) configuration option is designed to help run Datasette on a specific path behind a proxy - for example if you want to run an instance of Datasette at `/my-datasette/` within your existing site's URL hierarchy, proxied behind nginx or Apache.\r\n\r\nSupport for this configuration option has been greatly improved ([#1023](https://github.com/simonw/datasette/issues/1023)), and guidelines for using it are now available in a new documentation section on [Running Datasette behind a proxy](https://docs.datasette.io/en/stable/deploying.html#deploying-proxy). ([#1027](https://github.com/simonw/datasette/issues/1027))\r\n\r\n### Smaller changes\r\n\r\n- Wide tables shown within Datasette now scroll horizontally ([#998](https://github.com/simonw/datasette/issues/998)). This is achieved using a new `
` element which may impact the implementation of some plugins (for example [this change to datasette-cluster-map](https://github.com/simonw/datasette-cluster-map/commit/fcb4abbe7df9071c5ab57defd39147de7145b34e)).\r\n- New [debug-menu](https://docs.datasette.io/en/stable/authentication.html#permissions-debug-menu) permission. ([#1068](https://github.com/simonw/datasette/issues/1068))\r\n- Removed `--debug` option, which didn't do anything. ([#814](https://github.com/simonw/datasette/issues/814))\r\n- `Link:` HTTP header pagination. ([#1014](https://github.com/simonw/datasette/issues/1014))\r\n- `x` button for clearing filters. ([#1016](https://github.com/simonw/datasette/issues/1016))\r\n- Edit SQL button on canned queries, ([#1019](https://github.com/simonw/datasette/issues/1019))\r\n- `--load-extension=spatialite` shortcut. ([#1028](https://github.com/simonw/datasette/issues/1028))\r\n- scale-in animation for column action menu. ([#1039](https://github.com/simonw/datasette/issues/1039))\r\n- Option to pass a list of templates to `.render_template()` is now documented. ([#1045](https://github.com/simonw/datasette/issues/1045))\r\n- New `datasette.urls.static_plugins()` method. ([#1033](https://github.com/simonw/datasette/issues/1033))\r\n- `datasette -o` option now opens the most relevant page. ([#976](https://github.com/simonw/datasette/issues/976))\r\n- `datasette --cors` option now enables access to `/database.db` downloads. ([#1057](https://github.com/simonw/datasette/issues/1057))\r\n- Database file downloads now implement cascading permissions, so you can download a database if you have `view-database-download` permission even if you do not have permission to access the Datasette instance. ([#1058](https://github.com/simonw/datasette/issues/1058))\r\n- New documentation on [Designing URLs for your plugin](https://docs.datasette.io/en/stable/writing_plugins.html#writing-plugins-designing-urls). ([#1053](https://github.com/simonw/datasette/issues/1053))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.51.1", "id": 33314301, "node_id": "MDc6UmVsZWFzZTMzMzE0MzAx", "tag_name": "0.51.1", "target_commitish": "main", "name": "0.51.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-11-01T03:33:47Z", "published_at": "2020-11-01T03:34:36Z", "body": "- Improvements to the new [Binary data](https://docs.datasette.io/en/stable/binary_data.html#binary) documentation page.", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.51a0", "id": 32791115, "node_id": "MDc6UmVsZWFzZTMyNzkxMTE1", "tag_name": "0.51a0", "target_commitish": "main", "name": "0.51a0", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 1, "created_at": "2020-10-20T05:31:14Z", "published_at": "2020-10-20T05:33:01Z", "body": "- Fixed a bunch of issues relating to the [base_url](https://docs.datasette.io/en/latest/config.html#config-base-url) setting. ([#1023](https://github.com/simonw/datasette/issues/1023))\r\n- New `datasette.urls` URL builder for plugins, see [Building URLs within plugins](https://docs.datasette.io/en/latest/writing_plugins.html#writing-plugins-building-urls). ([#904](https://github.com/simonw/datasette/issues/904))\r\n- Removed `--debug` option, which didn't do anything. ([#814](https://github.com/simonw/datasette/issues/814))\r\n- `Link:` HTTP header pagination. ([#1014](https://github.com/simonw/datasette/issues/1014))\r\n- `x` button for clearing filters. ([#1016](https://github.com/simonw/datasette/issues/1016))\r\n- Edit SQL button on canned queries, ([#1019](https://github.com/simonw/datasette/issues/1019))\r\n- `--load-extension=spatialite` shortcut. ([#1028](https://github.com/simonw/datasette/issues/1028))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.51a1", "id": 33253780, "node_id": "MDc6UmVsZWFzZTMzMjUzNzgw", "tag_name": "0.51a1", "target_commitish": "main", "name": "0.51a1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 1, "created_at": "2020-10-30T05:35:23Z", "published_at": "2020-10-30T05:37:34Z", "body": "- New colour scheme and improved visual design, courtesy of Natalie Downe. ([#1056](https://github.com/simonw/datasette/pull/1056))\r\n- scale-in animation for column action menu. ([#1039](https://github.com/simonw/datasette/issues/1039))\r\n- Wide tables now scroll horizontally. ([#998](https://github.com/simonw/datasette/issues/998))\r\n- Option to pass a list of templates to `.render_template()` is now documented. ([#1045](https://github.com/simonw/datasette/issues/1045))\r\n- New `datasette.urls.static_plugins()` method. ([#1033](https://github.com/simonw/datasette/issues/1033))\r\n- `BLOB` column values can now be downloaded directly from the Datasette UI. ([#1036](https://github.com/simonw/datasette/issues/1036))\r\n- `.csv` exports now link to direct `BLOB` downloads. ([#1034](https://github.com/simonw/datasette/issues/1034))\r\n- `datasette -o` option now opens the most relevant page. ([#976](https://github.com/simonw/datasette/issues/976))\r\n- `datasette --cors` option now enables access to `/database.db` downloads. ([#1057](https://github.com/simonw/datasette/issues/1057))\r\n- Database file downloads now implement cascading permissions, so you can download a database if you have `view-database-download` permission even if you do not have permission to access the Datasette instance. ([#1058](https://github.com/simonw/datasette/issues/1058))\r\n- New documentation on [Designing URLs for your plugin](https://docs.datasette.io/en/latest/writing_plugins.html#writing-plugins-designing-urls). ([#1053](https://github.com/simonw/datasette/issues/1053))\r\n- New navigation menu plus a [menu_links(datasette, actor)](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-menu-links) plugin hook to customize it. ([#1064](https://github.com/simonw/datasette/issues/1064))\r\n- [table_actions(datasette, actor, database, table)](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-table-actions) plugin hook for the new table actions menu. ([#1066](https://github.com/simonw/datasette/issues/1066))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.51a2", "id": 33284522, "node_id": "MDc6UmVsZWFzZTMzMjg0NTIy", "tag_name": "0.51a2", "target_commitish": "main", "name": "0.51a2", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 1, "created_at": "2020-10-30T17:56:02Z", "published_at": "2020-10-30T17:57:53Z", "body": "- New [load_template(template, request, datasette)](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-load-template) plugin hook. ([#1042](https://github.com/simonw/datasette/issues/1042))\r\n- New [debug-menu](https://docs.datasette.io/en/latest/authentication.html#permissions-debug-menu) permission. ([#1068](https://github.com/simonw/datasette/issues/1068))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.52", "id": 34539374, "node_id": "MDc6UmVsZWFzZTM0NTM5Mzc0", "tag_name": "0.52", "target_commitish": "main", "name": "0.52", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-11-28T23:54:35Z", "published_at": "2020-11-28T23:57:12Z", "body": "This release includes a number of changes relating to an internal rebranding effort: Datasette's **configuration** mechanism (things like `datasette --config default_page_size:10`) has been renamed to **settings**.\r\n\r\n- New `--setting default_page_size 10` option as a replacement for `--config default_page_size:10` (note the lack of a colon). The `--config` option is deprecated but will continue working until Datasette 1.0. ([#992](https://github.com/simonw/datasette/issues/992))\r\n- The `/-/config` introspection page is now `/-/settings`, and the previous page redirects to the new one. ([#1103](https://github.com/simonw/datasette/issues/1103))\r\n- The `config.json` file in [Configuration directory mode](https://docs.datasette.io/en/stable/settings.html#config-dir) is now called `settings.json`. ([#1104](https://github.com/simonw/datasette/issues/1104))\r\n- The undocumented `datasette.config()` internal method has been replaced by a documented [.setting(key)](https://docs.datasette.io/en/stable/internals.html#datasette-setting) method. ([#1107](https://github.com/simonw/datasette/issues/1107))\r\n\r\nAlso in this release:\r\n\r\n- New plugin hook: [database_actions(datasette, actor, database)](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-database-actions), which adds menu items to a new cog menu shown at the top of the database page. ([#1077](https://github.com/simonw/datasette/issues/1077))\r\n- `datasette publish cloudrun` has a new `--apt-get-install` option that can be used to install additional Ubuntu packages as part of the deployment. This is useful for deploying the new [datasette-ripgrep plugin](https://github.com/simonw/datasette-ripgrep). ([#1110](https://github.com/simonw/datasette/issues/1110))\r\n- Swept the documentation to remove words that minimize involved difficulty. ([#1089](https://github.com/simonw/datasette/issues/1089))\r\n\r\nAnd some bug fixes:\r\n\r\n- Foreign keys linking to rows with blank label columns now display as a hyphen, allowing those links to be clicked. ([#1086](https://github.com/simonw/datasette/issues/1086))\r\n- Fixed bug where row pages could sometimes 500 if the underlying queries exceeded a time limit. ([#1088](https://github.com/simonw/datasette/issues/1088))\r\n- Fixed a bug where the table action menu could appear partially obscured by the edge of the page. ([#1084](https://github.com/simonw/datasette/issues/1084))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.52.1", "id": 34551688, "node_id": "MDc6UmVsZWFzZTM0NTUxNjg4", "tag_name": "0.52.1", "target_commitish": "main", "name": "0.52.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-11-29T19:38:29Z", "published_at": "2020-11-29T19:39:52Z", "body": "- Documentation on [Testing plugins](https://docs.datasette.io/en/stable/testing_plugins.html#testing-plugins) now recommends using [datasette.client](https://docs.datasette.io/en/stable/internals.html#internals-datasette-client). ([#1102](https://github.com/simonw/datasette/issues/1102))\r\n- Fix bug where compound foreign keys produced broken links. ([#1098](https://github.com/simonw/datasette/issues/1098))\r\n- `datasette --load-module=spatialite` now also checks for `/usr/local/lib/mod_spatialite.so`. Thanks, Dan Peterson. ([#1114](https://github.com/simonw/datasette/issues/1114))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.52.2", "id": 34725716, "node_id": "MDc6UmVsZWFzZTM0NzI1NzE2", "tag_name": "0.52.2", "target_commitish": "main", "name": "0.52.2", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-12-03T00:57:40Z", "published_at": "2020-12-03T00:58:43Z", "body": "- Generated columns from SQLite 3.31.0 or higher are now correctly displayed. ([#1116](https://github.com/simonw/datasette/issues/1116))\r\n- Error message if you attempt to open a SpatiaLite database now suggests using `--load-extension=spatialite` if it detects that the extension is available in a common location. ([#1115](https://github.com/simonw/datasette/issues/1115))\r\n- `OPTIONS` requests against the `/database` page no longer raise a 500 error. ([#1100](https://github.com/simonw/datasette/issues/1100))\r\n- Databases larger than 32MB that are published to Cloud Run can now be downloaded. ([#749](https://github.com/simonw/datasette/issues/749))\r\n- Fix for misaligned cog icon on table and database pages. Thanks, Abdussamet Ko\u00e7ak. ([#1121](https://github.com/simonw/datasette/issues/1121))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.52.3", "id": 34782337, "node_id": "MDc6UmVsZWFzZTM0NzgyMzM3", "tag_name": "0.52.3", "target_commitish": "main", "name": "0.52.3", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-12-03T19:07:05Z", "published_at": "2020-12-03T19:08:29Z", "body": "- Fixed bug where static assets would 404 for Datasette installed on ARM Amazon Linux. ([#1124](https://github.com/simonw/datasette/issues/1124>))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.52.4", "id": 34882011, "node_id": "MDc6UmVsZWFzZTM0ODgyMDEx", "tag_name": "0.52.4", "target_commitish": "main", "name": "0.52.4", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-12-05T19:42:42Z", "published_at": "2020-12-05T19:42:57Z", "body": "- Show [pysqlite3](https://github.com/coleifer/pysqlite3) version on `/-/versions`, if installed. ([#1125](https://github.com/simonw/datasette/issues/1125))\r\n- Errors output by Datasette (e.g. for invalid SQL queries) now go to `stderr`, not `stdout`. ([#1131](https://github.com/simonw/datasette/issues/1131))\r\n- Fix for a startup error on windows caused by unnecessary `from os import EX_CANTCREAT` - thanks, Abdussamet Ko\u00e7ak. ([#1094](https://github.com/simonw/datasette/issues/1094))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.52.5", "id": 35063580, "node_id": "MDc6UmVsZWFzZTM1MDYzNTgw", "tag_name": "0.52.5", "target_commitish": "0.52.x", "name": "0.52.5", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-12-09T20:03:44Z", "published_at": "2020-12-09T20:10:23Z", "body": "- Fix for error caused by combining the `_searchmode=raw` and `?_search_COLUMN` parameters. ([#1134](https://github.com/simonw/datasette/issues/1134))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.53", "id": 35131848, "node_id": "MDc6UmVsZWFzZTM1MTMxODQ4", "tag_name": "0.53", "target_commitish": "main", "name": "0.53", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-12-11T01:44:36Z", "published_at": "2020-12-11T01:46:44Z", "body": "Datasette has an official project website now, at . This release mainly updates the documentation to reflect the new site.\r\n\r\n- New `?column__arraynotcontains=` table filter. ([#1132](https://github.com/simonw/datasette/issues/1132))\r\n- `datasette serve` has a new `--create` option, which will create blank database files if they do not already exist rather than exiting with an error. ([#1135](https://github.com/simonw/datasette/issues/1135))\r\n- New `?_header=off` option for CSV export which omits the CSV header row, [documented here](https://docs.datasette.io/en/stable/csv_export.html#csv-export-url-parameters). ([#1133](https://github.com/simonw/datasette/issues/1133))\r\n- \"Powered by Datasette\" link in the footer now links to . ([#1138](https://github.com/simonw/datasette/issues/1138))\r\n- Project news no longer lives in the README - it can now be found at . ([#1137](https://github.com/simonw/datasette/issues/1137))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.54", "id": 36871901, "node_id": "MDc6UmVsZWFzZTM2ODcxOTAx", "tag_name": "0.54", "target_commitish": "main", "name": "0.54", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2021-01-25T17:35:06Z", "published_at": "2021-01-25T17:36:30Z", "body": "The two big new features in this release are the `_internal` SQLite in-memory database storing details of all connected databases and tables, and support for JavaScript modules in plugins and additional scripts.\r\n\r\nFor additional commentary on this release, see [Datasette 0.54, the annotated release notes](https://simonwillison.net/2021/Jan/25/datasette/).\r\n\r\n### The _internal database\r\n\r\nAs part of ongoing work to help Datasette handle much larger numbers of connected databases and tables (see [Datasette Library](https://github.com/simonw/datasette/issues/417)) Datasette now maintains an in-memory SQLite database with details of all of the attached databases, tables, columns, indexes and foreign keys. ([#1150](https://github.com/simonw/datasette/issues/1150))\r\n\r\nThis will support future improvements such as a searchable, paginated homepage of all available tables.\r\n\r\nYou can explore an example of this database by [signing in as root](https://latest.datasette.io/login-as-root) to the `latest.datasette.io` demo instance and then navigating to [latest.datasette.io/_internal](https://latest.datasette.io/_internal).\r\n\r\nPlugins can use these tables to introspect attached data in an efficient way. Plugin authors should note that this is not yet considered a stable interface, so any plugins that use this may need to make changes prior to Datasette 1.0 if the `_internal` table schemas change.\r\n\r\n### Named in-memory database support\r\n\r\nAs part of the work building the `_internal` database, Datasette now supports named in-memory databases that can be shared across multiple connections. This allows plugins to create in-memory databases which will persist data for the lifetime of the Datasette server process. ([#1151](https://github.com/simonw/datasette/issues/1151))\r\n\r\nThe new `memory_name=` parameter to the [Database class](https://docs.datasette.io/en/stable/internals.html#internals-database) can be used to create named, shared in-memory databases.\r\n\r\n### JavaScript modules\r\n\r\n[JavaScript modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules) were introduced in ECMAScript 2015 and provide native browser support for the `import` and `export` keywords.\r\n\r\nTo use modules, JavaScript needs to be included in `