` element, to help with advanced CSS customization. ([#1446](https://github.com/simonw/datasette/issues/1446))",107914493,datasette,
https://github.com/simonw/datasette/releases/tag/0.59a1,47507174,MDc6UmVsZWFzZTQ3NTA3MTc0,0.59a1,main,0.59a1,0,9599,simonw,1,2021-08-09T01:13:03Z,2021-08-09T01:14:06Z,- The [render_cell()](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-render-cell) plugin hook can now return an awaitable function. This means the hook can execute SQL queries. ([#1425](https://github.com/simonw/datasette/issues/1425)),107914493,datasette,"{""url"": ""https://api.github.com/repos/simonw/datasette/releases/47507174/reactions"", ""total_count"": 1, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 1, ""rocket"": 0, ""eyes"": 0}"
https://github.com/simonw/datasette/releases/tag/0.59a0,47461737,MDc6UmVsZWFzZTQ3NDYxNzM3,0.59a0,main,0.59a0,0,9599,simonw,1,2021-08-07T05:40:07Z,2021-08-07T05:42:25Z,"- [register_routes(datasette)](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-register-routes) plugin hook now accepts an optional `datasette` argument. ([#1404](https://github.com/simonw/datasette/issues/1404))
- New `hide_sql` canned query option for defaulting to hiding the SQL quey used by a canned query, see [Additional canned query options](https://docs.datasette.io/en/latest/sql_queries.html#canned-queries-options). ([#1422](https://github.com/simonw/datasette/issues/1422))
- New `--cpu` option for [datasette publish cloudrun](https://docs.datasette.io/en/latest/publish.html#publish-cloud-run). ([#1420](https://github.com/simonw/datasette/issues/1420))
- If [Rich](https://github.com/willmcgugan/rich) is installed in the same virtual environment as Datasette, it will be used to provide enhanced display of error tracebacks on the console. ([#1416](https://github.com/simonw/datasette/issues/1416))
- `datasette.utils` [parse_metadata(content)](https://docs.datasette.io/en/latest/internals.html#internals-utils-parse-metadata) function, used by the new [datasette-remote-metadata plugin](https://datasette.io/plugins/datasette-remote-metadata), is now a documented API. ([#1405](https://github.com/simonw/datasette/issues/1405))",107914493,datasette,
https://github.com/simonw/datasette/releases/tag/0.58.1,46341814,MDc6UmVsZWFzZTQ2MzQxODE0,0.58.1,main,0.58.1,0,9599,simonw,0,2021-07-16T19:50:06Z,2021-07-16T19:51:15Z,- Fix for an intermittent race condition caused by the `refresh_schemas()` internal function. ([#1231](https://github.com/simonw/datasette/issues/1231)),107914493,datasette,
https://github.com/simonw/datasette/releases/tag/0.58,46222036,MDc6UmVsZWFzZTQ2MjIyMDM2,0.58,main,0.58,0,9599,simonw,0,2021-07-15T00:33:04Z,2021-07-15T00:37:57Z,"- New `datasette --uds /tmp/datasette.sock` option for binding Datasette to a Unix domain socket, see [proxy documentation](https://docs.datasette.io/en/stable/deploying.html#deploying-proxy). ([#1388](https://github.com/simonw/datasette/issues/1388))
- `""searchmode"": ""raw""` table metadata option for defaulting a table to executing SQLite full-text search syntax without first escaping it, see [Advanced SQLite search queries](https://docs.datasette.io/en/stable/full_text_search.html#full-text-search-advanced-queries). ([#1389](https://github.com/simonw/datasette/issues/1389))
- New plugin hook: [get_metadata(datasette, key, database, table)](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-get-metadata), for returning custom metadata for an instance, database or table. Thanks, Brandon Roberts! ([#1384](https://github.com/simonw/datasette/issues/1384))
- New plugin hook: [skip_csrf(datasette, scope)](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-skip-csrf), for opting out of CSRF protection based on the incoming request. ([#1377](https://github.com/simonw/datasette/issues/1377))
- The [menu_links()](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-menu-links), [table_actions()](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-table-actions) and [database_actions()](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-database-actions) plugin hooks all gained a new optional `request` argument providing access to the current request. ([#1371](https://github.com/simonw/datasette/issues/1371))
- Major performance improvement for Datasette faceting. ([#1394](https://github.com/simonw/datasette/issues/1394))
- Improved documentation for [Running Datasette behind a proxy](https://docs.datasette.io/en/stable/deploying.html#deploying-proxy) to recommend using `ProxyPreservehost On` with Apache. ([#1387](https://github.com/simonw/datasette/issues/1387))
- `POST` requests to endpoints that do not support that HTTP verb now return a 405 error.
- `db.path` can now be provided as a `pathlib.Path` object, useful when writing unit tests for plugins. Thanks, Chris Amico. ([#1365](https://github.com/simonw/datasette/issues/1365))",107914493,datasette,
https://github.com/simonw/datasette/releases/tag/0.58a1,45182156,MDc6UmVsZWFzZTQ1MTgyMTU2,0.58a1,main,0.58a1,0,9599,simonw,1,2021-06-24T16:24:59Z,2021-06-24T16:29:09Z,"- New plugin hook: [skip_csrf(datasette, scope)](https://docs.datasette.io/en/latest//plugin_hooks.html#plugin-hook-skip-csrf), for opting out of CSRF protection based on the incoming request. ([#1377](https://github.com/simonw/datasette/issues/1377))
- `POST` requests to endpoints that do not support that HTTP verb now return a 405 error.
- `db.path` can now be provided as a `pathlib.Path` object, useful when writing unit tests for plugins. Thanks, Chris Amico. ([#1365](https://github.com/simonw/datasette/issues/1365))",107914493,datasette,"{""url"": ""https://api.github.com/repos/simonw/datasette/releases/45182156/reactions"", ""total_count"": 1, ""+1"": 1, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}"
https://github.com/simonw/datasette/releases/tag/0.58a0,44388485,MDc6UmVsZWFzZTQ0Mzg4NDg1,0.58a0,main,0.58a0,0,9599,simonw,1,2021-06-10T04:51:14Z,2021-06-10T04:52:45Z,"- The [menu_links()](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-menu-links), [table_actions()](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-table-actions) and [database_actions()](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-database-actions) plugin hooks all gained a new optional `request` argument providing access to the current request. ([#1371](https://github.com/simonw/datasette/issues/1371))",107914493,datasette,
https://github.com/simonw/datasette/releases/tag/0.57.1,44292523,MDc6UmVsZWFzZTQ0MjkyNTIz,0.57.1,main,0.57.1,0,9599,simonw,0,2021-06-08T16:26:45Z,2021-06-08T16:28:31Z,"- Fixed visual display glitch with global navigation menu. ([#1367](https://github.com/simonw/datasette/issues/1367))
- No longer truncates the list of table columns displayed on the `/database` page. ([#1364](https://github.com/simonw/datasette/issues/1364))",107914493,datasette,"{""url"": ""https://api.github.com/repos/simonw/datasette/releases/44292523/reactions"", ""total_count"": 4, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 4, ""rocket"": 0, ""eyes"": 0}"
https://github.com/simonw/datasette/releases/tag/0.57,44155601,MDc6UmVsZWFzZTQ0MTU1NjAx,0.57,main,0.57,0,9599,simonw,0,2021-06-05T22:06:55Z,2021-06-05T22:11:18Z,"**Warning**: This release fixes a [reflected cross-site scripting](https://owasp.org/www-community/attacks/xss/#reflected-xss-attacks) security hole with the `?_trace=1` feature. You should upgrade to this version, or to Datasette 0.56.1, as soon as possible. ([#1360](https://github.com/simonw/datasette/issues/1360))
In addition to the security fix, this release includes `?_col=` and `?_nocol=` options for controlling which columns are displayed for a table, `?_facet_size=` for increasing the number of facet results returned, re-display of your SQL query should an error occur and numerous bug fixes.
### New features
- If an error occurs while executing a user-provided SQL query, that query is now re-displayed in an editable form along with the error message. ([#619](https://github.com/simonw/datasette/issues/619))
- New `?_col=` and `?_nocol=` parameters to show and hide columns in a table, plus an interface for hiding and showing columns in the column cog menu. ([#615](https://github.com/simonw/datasette/issues/615))
- A new `?_facet_size=` parameter for customizing the number of facet results returned on a table or view page. ([#1332](https://github.com/simonw/datasette/issues/1332))
- `?_facet_size=max` sets that to the maximum, which defaults to 1,000 and is controlled by the the [max_returned_rows](https://docs.datasette.io/en/stable/settings.html#setting-max-returned-rows) setting. If facet results are truncated the ... at the bottom of the facet list now links to this parameter. ([#1337](https://github.com/simonw/datasette/issues/1337))
- `?_nofacet=1` option to disable all facet calculations on a page, used as a performance optimization for CSV exports and `?_shape=array/object`. ([#1349](https://github.com/simonw/datasette/issues/1349), [#263](https://github.com/simonw/datasette/issues/263))
- `?_nocount=1` option to disable full query result counts. ([#1353](https://github.com/simonw/datasette/issues/1353))
- `?_trace=1` debugging option is now controlled by the new [trace_debug](https://docs.datasette.io/en/stable/settings.html#setting-trace-debug) setting, which is turned off by default. ([#1359](https://github.com/simonw/datasette/issues/1359))
### Bug fixes and other improvements
- [Custom pages](https://docs.datasette.io/en/stable/custom_templates.html#custom-pages) now work correctly when combined with the [base_url](https://docs.datasette.io/en/stable/settings.html#setting-base-url) setting. ([#1238](https://github.com/simonw/datasette/issues/1238))
- Fixed intermittent error displaying the index page when the user did not have permission to access one of the tables. Thanks, Guy Freeman. ([#1305](https://github.com/simonw/datasette/issues/1305))
- Columns with the name ""Link"" are no longer incorrectly displayed in bold. ([#1308](https://github.com/simonw/datasette/issues/1308))
- Fixed error caused by tables with a single quote in their names. ([#1257](https://github.com/simonw/datasette/issues/1257))
- Updated dependencies: `pytest-asyncio`, `Black`, `jinja2`, `aiofiles`, `click`, and `itsdangerous`.
- The official Datasette Docker image now supports `apt-get install`. ([#1320](https://github.com/simonw/datasette/issues/1320))
- The Heroku runtime used by `datasette publish heroku` is now `python-3.8.10`.",107914493,datasette,"{""url"": ""https://api.github.com/repos/simonw/datasette/releases/44155601/reactions"", ""total_count"": 1, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 1, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}"
https://github.com/simonw/datasette/releases/tag/0.56.1,44155459,MDc6UmVsZWFzZTQ0MTU1NDU5,0.56.1,0.56.x,0.56.1,0,9599,simonw,0,2021-06-05T21:54:47Z,2021-06-05T22:00:01Z,- Fix for a security hole: [reflected cross-site scripting](https://owasp.org/www-community/attacks/xss/#reflected-xss-attacks) in the `?_trace=1` feature. [#1360](https://github.com/simonw/datasette/issues/1360),107914493,datasette,
https://github.com/simonw/datasette/releases/tag/0.51,33311677,MDc6UmVsZWFzZTMzMzExNjc3,0.51,main,0.51,0,9599,simonw,0,2020-10-31T22:24:54Z,2020-10-31T22:29:33Z,"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.
### New visual design
Datasette 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))
![datasette-0 51](https://user-images.githubusercontent.com/9599/97791267-d9011e80-1b8d-11eb-9b1b-42908266f36f.png)
### Plugins can now add links within Datasette
A 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).
Plugins 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.
The 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.
### Binary data
SQLite 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)).
### URL building
The 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))
### Running Datasette behind a proxy
The [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.
Support 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))
### Smaller changes
- 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)).
- New [debug-menu](https://docs.datasette.io/en/stable/authentication.html#permissions-debug-menu) permission. ([#1068](https://github.com/simonw/datasette/issues/1068))
- Removed `--debug` option, which didn't do anything. ([#814](https://github.com/simonw/datasette/issues/814))
- `Link:` HTTP header pagination. ([#1014](https://github.com/simonw/datasette/issues/1014))
- `x` button for clearing filters. ([#1016](https://github.com/simonw/datasette/issues/1016))
- Edit SQL button on canned queries, ([#1019](https://github.com/simonw/datasette/issues/1019))
- `--load-extension=spatialite` shortcut. ([#1028](https://github.com/simonw/datasette/issues/1028))
- scale-in animation for column action menu. ([#1039](https://github.com/simonw/datasette/issues/1039))
- Option to pass a list of templates to `.render_template()` is now documented. ([#1045](https://github.com/simonw/datasette/issues/1045))
- New `datasette.urls.static_plugins()` method. ([#1033](https://github.com/simonw/datasette/issues/1033))
- `datasette -o` option now opens the most relevant page. ([#976](https://github.com/simonw/datasette/issues/976))
- `datasette --cors` option now enables access to `/database.db` downloads. ([#1057](https://github.com/simonw/datasette/issues/1057))
- 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))
- 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))",107914493,datasette,
https://github.com/simonw/datasette/releases/tag/0.51.1,33314301,MDc6UmVsZWFzZTMzMzE0MzAx,0.51.1,main,0.51.1,0,9599,simonw,0,2020-11-01T03:33:47Z,2020-11-01T03:34:36Z,- Improvements to the new [Binary data](https://docs.datasette.io/en/stable/binary_data.html#binary) documentation page.,107914493,datasette,
https://github.com/simonw/datasette/releases/tag/0.51a2,33284522,MDc6UmVsZWFzZTMzMjg0NTIy,0.51a2,main,0.51a2,0,9599,simonw,1,2020-10-30T17:56:02Z,2020-10-30T17:57:53Z,"- 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))
- New [debug-menu](https://docs.datasette.io/en/latest/authentication.html#permissions-debug-menu) permission. ([#1068](https://github.com/simonw/datasette/issues/1068))",107914493,datasette,
https://github.com/simonw/datasette/releases/tag/0.51a1,33253780,MDc6UmVsZWFzZTMzMjUzNzgw,0.51a1,main,0.51a1,0,9599,simonw,1,2020-10-30T05:35:23Z,2020-10-30T05:37:34Z,"- New colour scheme and improved visual design, courtesy of Natalie Downe. ([#1056](https://github.com/simonw/datasette/pull/1056))
- scale-in animation for column action menu. ([#1039](https://github.com/simonw/datasette/issues/1039))
- Wide tables now scroll horizontally. ([#998](https://github.com/simonw/datasette/issues/998))
- Option to pass a list of templates to `.render_template()` is now documented. ([#1045](https://github.com/simonw/datasette/issues/1045))
- New `datasette.urls.static_plugins()` method. ([#1033](https://github.com/simonw/datasette/issues/1033))
- `BLOB` column values can now be downloaded directly from the Datasette UI. ([#1036](https://github.com/simonw/datasette/issues/1036))
- `.csv` exports now link to direct `BLOB` downloads. ([#1034](https://github.com/simonw/datasette/issues/1034))
- `datasette -o` option now opens the most relevant page. ([#976](https://github.com/simonw/datasette/issues/976))
- `datasette --cors` option now enables access to `/database.db` downloads. ([#1057](https://github.com/simonw/datasette/issues/1057))
- 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))
- 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))
- 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))
- [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))",107914493,datasette,
https://github.com/simonw/datasette/releases/tag/0.51a0,32791115,MDc6UmVsZWFzZTMyNzkxMTE1,0.51a0,main,0.51a0,0,9599,simonw,1,2020-10-20T05:31:14Z,2020-10-20T05:33:01Z,"- 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))
- 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))
- Removed `--debug` option, which didn't do anything. ([#814](https://github.com/simonw/datasette/issues/814))
- `Link:` HTTP header pagination. ([#1014](https://github.com/simonw/datasette/issues/1014))
- `x` button for clearing filters. ([#1016](https://github.com/simonw/datasette/issues/1016))
- Edit SQL button on canned queries, ([#1019](https://github.com/simonw/datasette/issues/1019))
- `--load-extension=spatialite` shortcut. ([#1028](https://github.com/simonw/datasette/issues/1028))",107914493,datasette,
https://github.com/simonw/datasette/releases/tag/0.50.2,32397338,MDc6UmVsZWFzZTMyMzk3MzM4,0.50.2,main,0.50.2,0,9599,simonw,0,2020-10-10T03:53:47Z,2020-10-10T03:59:18Z,"* Fixed another bug introduced in 0.50 where column header links on the table page were broken. (#1011)
",107914493,datasette,
https://github.com/simonw/datasette/releases/tag/0.50.1,32395303,MDc6UmVsZWFzZTMyMzk1MzAz,0.50.1,main,0.50.1,0,9599,simonw,0,2020-10-10T00:41:35Z,2020-10-10T00:44:23Z,"- Fixed a bug introduced in 0.50 where the export as JSON/CSV links on the table, row and query pages were broken. (#1010)
",107914493,datasette,
https://github.com/simonw/datasette/releases/tag/0.50,32384200,MDc6UmVsZWFzZTMyMzg0MjAw,0.50,main,0.50,0,9599,simonw,0,2020-10-09T17:57:55Z,2020-10-09T17:58:27Z,"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.
Plugin 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))
New [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))
Other improvements in this release:
- [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))
- New `datasette -o` option which opens your browser as soon as Datasette starts up. ([#970](https://github.com/simonw/datasette/issues/970))
- 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))
- 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))
- 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).
- Fixed a routing bug with custom page wildcard templates. ([#996](https://github.com/simonw/datasette/issues/996))
- `datasette publish heroku` now deploys using Python 3.8.6.
- New `datasette publish heroku --tar=` option. ([#969](https://github.com/simonw/datasette/issues/969))
- `OPTIONS` requests against HTML pages no longer return a 500 error. ([#1001](https://github.com/simonw/datasette/issues/1001))
- Datasette now supports Python 3.9.",107914493,datasette,
https://github.com/simonw/datasette/releases/tag/0.50a1,32238807,MDc6UmVsZWFzZTMyMjM4ODA3,0.50a1,main,0.50a1,0,9599,simonw,1,2020-10-06T20:50:54Z,2020-10-06T20:52:49Z,"- Column action menu now shows the column type. ([#993](https://github.com/simonw/datasette/issues/993))
- Column action sort links now correctly link to the first page of sorted results. ([#989](https://github.com/simonw/datasette/issues/989))
- [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))",107914493,datasette,
https://github.com/simonw/datasette/releases/tag/0.50a0,32072114,MDc6UmVsZWFzZTMyMDcyMTE0,0.50a0,main,0.50a0,0,9599,simonw,1,2020-10-01T23:35:04Z,2020-10-01T23:35:54Z,"- 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))
- New `datasette -o` option which opens your browser as soon as Datasette starts up. ([#970](https://github.com/simonw/datasette/issues/970)
- `sqlite3.enable_callback_tracebacks(True)` so errors in custom SQL functions will now display tracebacks. ([#891](https://github.com/simonw/datasette/issues/891))
- 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))",107914493,datasette,
https://github.com/simonw/datasette/releases/tag/0.49.1,31354944,MDc6UmVsZWFzZTMxMzU0OTQ0,0.49.1,main,0.49.1,0,9599,simonw,0,2020-09-15T20:20:15Z,2020-09-15T20:21:16Z,"- Fixed a bug with writable canned queries that use magic parameters but accept no non-magic arguments. (#967)
",107914493,datasette,
https://github.com/simonw/datasette/releases/tag/0.49,31288240,MDc6UmVsZWFzZTMxMjg4MjQw,0.49,main,0.49,0,9599,simonw,0,2020-09-14T21:38:24Z,2020-09-14T21:40:11Z,"- 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))
- 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))
- `register_output_renderer()` render functions can now return a `Response`. ([#953](https://github.com/simonw/datasette/issues/953))
- New `--upgrade` option for `datasette install`. ([#945](https://github.com/simonw/datasette/issues/945))
- New `datasette --pdb` option. ([#962](https://github.com/simonw/datasette/issues/962))
- `datasette --get` exit code now reflects the internal HTTP status code. ([#947](https://github.com/simonw/datasette/issues/947))
- New `raise_404()` template function for returning 404 errors. ([#964](https://github.com/simonw/datasette/issues/964))
- `datasette publish heroku` now deploys using Python 3.8.5
- Upgraded [CodeMirror](https://codemirror.net/) to 5.57.0. ([#948](https://github.com/simonw/datasette/issues/948))
- Upgraded code style to Black 20.8b1. ([#958](https://github.com/simonw/datasette/issues/958))
- 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))
- Renamed the default error template from `500.html` to `error.html`.
- 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))",107914493,datasette,
https://github.com/simonw/datasette/releases/tag/0.49a1,31227999,MDc6UmVsZWFzZTMxMjI3OTk5,0.49a1,main,0.49a1,0,9599,simonw,1,2020-09-14T02:47:21Z,2020-09-14T02:48:19Z,"- Upgraded [CodeMirror](https://codemirror.net/) to 5.57.0. ([#948](https://github.com/simonw/datasette/issues/948))
- Upgraded code style to Black 20.8b1. ([#958](https://github.com/simonw/datasette/issues/958))
- New `datasette --pdb` option. ([#962](https://github.com/simonw/datasette/issues/962))
- `datasette --get` exit code now reflects the internal HTTP status code. ([#947](https://github.com/simonw/datasette/issues/947))
- 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))
- New mechanism for defining page templates with custom path parameters. ([#944](https://github.com/simonw/datasette/issues/944))",107914493,datasette,
https://github.com/simonw/datasette/releases/tag/0.49a0,30353073,MDc6UmVsZWFzZTMwMzUzMDcz,0.49a0,main,0.49a0,0,9599,simonw,1,2020-08-28T23:12:47Z,2020-08-28T23:18:09Z,"- `register_output_renderer()` render functions can now return a `Response`. ([#953](https://github.com/simonw/datasette/issues/953))
- New `--upgrade` option for `datasette install`. ([#945](https://github.com/simonw/datasette/issues/945))
- `datasette publish heroku` now deploys using Python 3.8.5",107914493,datasette,
https://github.com/simonw/datasette/releases/tag/0.55,38264801,MDc6UmVsZWFzZTM4MjY0ODAx,0.55,main,0.55,0,9599,simonw,0,2021-02-19T02:01:06Z,2021-02-19T02:02:29Z,"Support for cross-database SQL queries and built-in support for serving via HTTPS.
- The new `--crossdb` command-line option causes Datasette to attach up to ten database files to the same `/_memory` database connection. This enables cross-database SQL queries, including the ability to use joins and unions to combine data from tables that exist in different database files. See [Cross-database queries](https://docs.datasette.io/en/stable/sql_queries.html#cross-database-queries) for details. ([#283](https://github.com/simonw/datasette/issues/283))
- `--ssl-keyfile` and `--ssl-certfile` options can be used to specify a TLS certificate, allowing Datasette to serve traffic over `https://` without needing to run it behind a separate proxy. ([#1221](https://github.com/simonw/datasette/issues/1221))
- The `/:memory:` page has been renamed (and redirected) to `/_memory` for consistency with the new `/_internal` database introduced in Datasette 0.54. ([#1205](https://github.com/simonw/datasette/issues/1205))
- Added plugin testing documentation on [Using pdb for errors thrown inside Datasette](https://docs.datasette.io/en/stable//testing_plugins.html#testing-plugins-pdb). ([#1207](https://github.com/simonw/datasette/issues/1207))
- The [official Datasette Docker image](https://hub.docker.com/r/datasetteproject/datasette) now uses Python 3.7.10, applying [the latest security fix](https://www.python.org/downloads/release/python-3710/) for that Python version. ([#1235](https://github.com/simonw/datasette/issues/1235))",107914493,datasette,
https://github.com/simonw/datasette/releases/tag/0.54.1,37262719,MDc6UmVsZWFzZTM3MjYyNzE5,0.54.1,0.54.x,0.54.1,0,9599,simonw,0,2021-02-02T21:23:39Z,2021-02-02T21:30:12Z,- Fixed a bug where `?_search=` and `?_sort=` parameters were incorrectly duplicated when the filter form on the table page was re-submitted. ([#1214](https://github.com/simonw/datasette/issues/1214)),107914493,datasette,
https://github.com/simonw/datasette/releases/tag/0.54,36871901,MDc6UmVsZWFzZTM2ODcxOTAx,0.54,main,0.54,0,9599,simonw,0,2021-01-25T17:35:06Z,2021-01-25T17:36:30Z,"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.
For additional commentary on this release, see [Datasette 0.54, the annotated release notes](https://simonwillison.net/2021/Jan/25/datasette/).
### The _internal database
As 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))
This will support future improvements such as a searchable, paginated homepage of all available tables.
You 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).
Plugins 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.
### Named in-memory database support
As 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))
The 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.
### JavaScript modules
[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.
To use modules, JavaScript needs to be included in `