html_url,id,node_id,tag_name,target_commitish,name,draft,author,author_label,prerelease,created_at,published_at,body,repo,repo_label,reactions https://github.com/simonw/datasette/releases/tag/0.27,15389392,MDc6UmVsZWFzZTE1Mzg5Mzky,0.27,master,Datasette 0.27,0,9599,simonw,0,2019-02-01T03:47:05Z,2019-02-06T05:10:20Z,https://datasette.readthedocs.io/en/stable/changelog.html#v0-27,107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.28,17450414,MDc6UmVsZWFzZTE3NDUwNDE0,0.28,master,Datasette 0.28,0,9599,simonw,0,2019-05-19T21:37:49Z,2019-05-19T21:42:28Z,"[Datasette 0.28](https://datasette.readthedocs.io/en/stable/changelog.html#v0-28) - a salmagundi of new features! * No longer immutable! Datasette now supports [databases that change](https://datasette.readthedocs.io/en/stable/changelog.html#supporting-databases-that-change). * [Faceting improvements](https://datasette.readthedocs.io/en/stable/changelog.html#faceting-improvements-and-faceting-plugins) including facet-by-JSON-array and the ability to define custom faceting using plugins. * [datasette publish cloudrun](https://datasette.readthedocs.io/en/stable/changelog.html#datasette-publish-cloudrun) lets you publish databasese to Google's new Cloud Run hosting service. * New [register_output_renderer](https://datasette.readthedocs.io/en/stable/changelog.html#register-output-renderer-plugins) plugin hook for adding custom output extensions to Datasette in addition to the default `.json` and `.csv`. * Dozens of other smaller features and tweaks - see [the release notes](https://datasette.readthedocs.io/en/stable/changelog.html#v0-28) for full details.",107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.29,18461320,MDc6UmVsZWFzZTE4NDYxMzIw,0.29,master,Datasette 0.29,0,9599,simonw,0,2019-07-08T03:14:27Z,2019-07-08T03:43:13Z,"ASGI, new plugin hooks, facet by date and much, much more… See [the release notes](https://datasette.readthedocs.io/en/stable/changelog.html#v0-29) for full details.",107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.29.1,18598489,MDc6UmVsZWFzZTE4NTk4NDg5,0.29.1,master,0.29.1,0,9599,simonw,0,2019-07-11T16:17:55Z,2019-07-14T01:43:44Z,"- Fixed bug with static mounts using relative paths which could lead to traversal exploits (#555) - thanks Abdussamet Kocak! https://datasette.readthedocs.io/en/stable/changelog.html#v0-29-1",107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.29.2,19704661,MDc6UmVsZWFzZTE5NzA0NjYx,0.29.2,master,0.29.2,0,9599,simonw,0,2019-07-14T03:04:05Z,2019-09-03T00:33:35Z,"* Bumped Uvicorn to 0.8.4, fixing a bug where the querystring was not included in the server logs. (#559) * Fixed bug where the navigation breadcrumbs were not displayed correctly on the page for a custom query. (#558) * Fixed bug where custom query names containing unicode characters caused errors. https://datasette.readthedocs.io/en/stable/changelog.html#v0-29-2",107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.29.3,20795250,MDc6UmVsZWFzZTIwNzk1MjUw,0.29.3,master,0.29.3,0,9599,simonw,0,2019-09-03T00:40:53Z,2019-10-18T05:24:54Z,https://datasette.readthedocs.io/en/stable/changelog.html#v0-29-3,107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.30,21098052,MDc6UmVsZWFzZTIxMDk4MDUy,0.30,master,0.30,0,9599,simonw,0,2019-10-19T01:08:04Z,2019-10-30T18:51:30Z,https://datasette.readthedocs.io/en/stable/changelog.html#v0-30,107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.30.1,21162064,MDc6UmVsZWFzZTIxMTYyMDY0,0.30.1,master,0.30.1,0,9599,simonw,0,2019-10-30T19:00:21Z,2019-11-02T00:06:02Z,https://datasette.readthedocs.io/en/stable/changelog.html#v0-30-1,107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.30.2,21169835,MDc6UmVsZWFzZTIxMTY5ODM1,0.30.2,master,0.30.2,0,9599,simonw,0,2019-11-02T23:12:46Z,2019-11-02T23:33:13Z,https://datasette.readthedocs.io/en/latest/changelog.html#v0-30-2,107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.31,21426008,MDc6UmVsZWFzZTIxNDI2MDA4,0.31,master,Datasette 0.31,0,9599,simonw,0,2019-11-12T05:33:51Z,2019-11-13T02:16:15Z,"This version adds compatibility with Python 3.8 and breaks compatibility with Python 3.5. Full release notes: https://datasette.readthedocs.io/en/stable/changelog.html#v0-31",107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.31.1,21426299,MDc6UmVsZWFzZTIxNDI2Mjk5,0.31.1,master,0.31.1,0,9599,simonw,0,2019-11-13T02:18:39Z,2019-11-13T02:40:53Z,"- Deployments created using `datasette publish` now use `python:3.8` base Docker image (#629) https://datasette.readthedocs.io/en/latest/changelog.html#v0-31-1",107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.31.2,21449006,MDc6UmVsZWFzZTIxNDQ5MDA2,0.31.2,master,0.31.2,0,9599,simonw,0,2019-11-13T16:48:36Z,2019-11-13T17:38:59Z,"- Fixed a bug where datasette publish heroku applications failed to start (#633) - Fix for datasette publish with just --source_url - thanks, Stanley Zheng (#572) - Deployments to Heroku now use Python 3.8.0 (#632) https://datasette.readthedocs.io/en/latest/changelog.html#v0-31-2",107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.32,21492068,MDc6UmVsZWFzZTIxNDkyMDY4,0.32,master,Datasette 0.32,0,9599,simonw,0,2019-11-14T23:20:21Z,2019-11-14T23:42:14Z,"Datasette now renders templates using [Jinja async mode](https://jinja.palletsprojects.com/en/2.10.x/api/#async-support). This makes it easy for plugins to provide custom template functions that perform asynchronous actions, for example the new [datasette-template-sql](https://github.com/simonw/datasette-template-sql) plugin which allows custom templates to directly execute SQL queries and render their results. (#628) https://datasette.readthedocs.io/en/latest/changelog.html#v0-32",107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.33,22415542,MDc6UmVsZWFzZTIyNDE1NTQy,0.33,master,Datasette 0.33,0,9599,simonw,0,2019-12-22T16:27:04Z,2019-12-22T16:43:31Z,"* `rowid` is now included in dropdown menus for filtering tables (#636) * Columns are now only suggested for faceting if they have at least one value with more than one record (#638) * Queries with no results now display “0 results” (#637) * Improved documentation for the `--static` option (#641) * asyncio task information is now included on the `/-/threads` debug page * Bumped Uvicorn dependency 0.11 * You can now use `--port 0` to listen on an available port * New `template_debug` setting for debugging templates, e.g. https://latest.datasette.io/fixtures/roadside_attractions?_context=1 (#654) https://datasette.readthedocs.io/en/latest/changelog.html#v0-33",107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.34,23239304,MDc6UmVsZWFzZTIzMjM5MzA0,0.34,master,Datasette 0.34,0,9599,simonw,0,2020-01-30T00:09:01Z,2020-01-30T00:29:21Z,"- `_search=` queries are now correctly escaped using a new `escape_fts()` custom SQL function. This means you can now run searches for strings like `park.` without seeing errors. (#651) - Google Cloud Run is no longer in beta, so `datasette publish cloudrun` has been updated to work even if the user has not installed the `gcloud` beta components package. Thanks, Katie McLaughlin (#660) - `datasette package` now accepts a `--port` option for specifying which port the resulting Docker container should listen on. (#661) https://datasette.readthedocs.io/en/stable/changelog.html#v0-34 ",107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.35,23395622,MDc6UmVsZWFzZTIzMzk1NjIy,0.35,master,Datasette 0.35,0,9599,simonw,0,2020-02-05T02:17:47Z,2020-02-05T02:32:34Z,"* Added five new plugins and one new conversion tool to the [The Datasette Ecosystem](https://datasette.readthedocs.io/en/latest/ecosystem.html#ecosystem). * The `Datasette` class has a new `render_template()` method which can be used by plugins to render templates using Datasette’s pre-configured [Jinja](https://jinja.palletsprojects.com/) templating library. * You can now execute SQL queries that start with a `-- comment` - thanks, Jay Graves (#653) https://datasette.readthedocs.io/en/latest/changelog.html#v0-35",107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.36,23896184,MDc6UmVsZWFzZTIzODk2MTg0,0.36,master,Datasette 0.36,0,9599,simonw,0,2020-02-22T03:04:46Z,2020-02-22T03:24:50Z,"* The `datasette` object passed to plugins now has API documentation: [Datasette class](https://datasette.readthedocs.io/en/latest/datasette.html#datasette). (#576) * New methods on `datasette`: `.add_database()` and `.remove_database()` - [documentation](https://datasette.readthedocs.io/en/latest/datasette.html#datasette-add-database). (#671) * `prepare_connection()` plugin hook now takes optional `datasette` and `database` arguments - [prepare_connection(conn, database, datasette)](https://datasette.readthedocs.io/en/latest/plugins.html#plugin-hook-prepare-connection). (#678) * Added three new plugins and one new conversion tool to the [The Datasette Ecosystem](https://datasette.readthedocs.io/en/latest/ecosystem.html#ecosystem). https://datasette.readthedocs.io/en/latest/changelog.html#v0-36",107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.37,23986460,MDc6UmVsZWFzZTIzOTg2NDYw,0.37,master,Datasette 0.37,0,9599,simonw,0,2020-02-26T01:22:02Z,2020-02-26T03:44:07Z,"* Plugins now have a supported mechanism for writing to a database, using the new `.execute_write()` and `.execute_write_fn()` methods. [Documentation](https://datasette.readthedocs.io/en/stable/internals.html#database-execute-write). (#682) * Immutable databases that have had their rows counted using the `inspect` command now use the calculated count more effectively - thanks, Kevin Keogh. (#666) * `--reload` no longer restarts the server if a database file is modified, unless that database was opened immutable mode with `-i`. (#494) * New `?_searchmode=raw` option turns off escaping for FTS queries in `?_search=` allowing full use of SQLite’s [FTS5 query syntax](https://www.sqlite.org/fts5.html#full_text_query_syntax). (#676) ",107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.37.1,24154697,MDc6UmVsZWFzZTI0MTU0Njk3,0.37.1,master,Datasette 0.37.1,0,9599,simonw,0,2020-03-03T03:43:08Z,2020-03-03T03:46:17Z,"* Don’t attempt to count table rows to display on the index page for databases > 100MB. (#688) * Print exceptions if they occur in the write thread rather than silently swallowing them. * Handle the possibility of `scope[""path""]` being a string rather than bytes * Better documentation for the [extra_template_vars(template, database, table, view_name, request, datasette)](https://datasette.readthedocs.io/en/stable/plugins.html#plugin-hook-extra-template-vars) plugin hook. ",107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.38,24330942,MDc6UmVsZWFzZTI0MzMwOTQy,0.38,master,0.38,0,9599,simonw,0,2020-03-08T23:26:50Z,2020-03-08T23:42:36Z,"* The [Docker build](https://hub.docker.com/r/datasetteproject/datasette) of Datasette now uses SQLite 3.31.1, upgraded from 3.26. (#695) * `datasette publish cloudrun` now accepts an optional `--memory=2Gi` flag for setting the Cloud Run allocated memory to a value other than the default (256Mi). (#694) * Fixed bug where templates that shipped with plugins were sometimes not being correctly loaded. (#697) ",107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.39,24836140,MDc6UmVsZWFzZTI0ODM2MTQw,0.39,master,0.39,0,9599,simonw,0,2020-03-25T04:02:37Z,2020-03-25T04:11:35Z,"* New [base_url](https://datasette.readthedocs.io/en/latest/config.html#config-base-url) configuration setting for serving up the correct links while running Datasette under a different URL prefix. (#394) * New metadata settings `""sort""` and `""sort_desc""` for setting the default sort order for a table. See [Setting a default sort order](https://datasette.readthedocs.io/en/latest/metadata.html#metadata-default-sort). (#702) * Sort direction arrow now displays by default on the primary key. This means you only have to click once (not twice) to sort in reverse order. (#677) * New `await Request(scope, receive).post_vars()` method for accessing POST form variables. (#700) * Plugin hooks documentation now links to example uses of each plugin. (#709) ",107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.40,25748264,MDc6UmVsZWFzZTI1NzQ4MjY0,0.40,master,0.40,0,9599,simonw,0,2020-04-22T04:06:39Z,2020-04-22T04:06:51Z,"* Datasette [Metadata](https://datasette.readthedocs.io/en/latest/metadata.html) can now be provided as a YAML file as an optional alternative to JSON. See [Using YAML for metadata](https://datasette.readthedocs.io/en/latest/metadata.html#metadata-yaml). (#713) * Removed support for `datasette publish now`, which used the the now-retired Zeit Now v1 hosting platform. A new plugin, [datasette-publish-now](https://github.com/simonw/datasette-publish-now), can be installed to publish data to Zeit ([now Vercel](https://vercel.com/blog/zeit-is-now-vercel)) Now v2. (#710) * Fixed a bug where the `extra_template_vars(request, view_name)` plugin hook was not receiving the correct `view_name`. (#716) * Variables added to the template context by the `extra_template_vars()` plugin hook are now shown in the `?_context=1` debugging mode (see [template_debug](https://datasette.readthedocs.io/en/latest/config.html#config-template-debug)). (#693) * Fixed a bug where the “templates considered” HTML comment was no longer being displayed. (#689) * Fixed a `datasette publish` bug where `--plugin-secret` would over-ride plugin configuration in the provided `metadata.json` file. (#724) * Added a new CSS class for customizing the canned query page. (#727)",107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.41,26240662,MDc6UmVsZWFzZTI2MjQwNjYy,0.41,master,0.41,0,9599,simonw,0,2020-05-06T18:20:58Z,2020-05-06T18:30:03Z,"You can now create [custom pages](https://datasette.readthedocs.io/en/0.41/custom_templates.html#custom-pages) within your Datasette instance using a custom template file. For example, adding a template file called `templates/pages/about.html` will result in a new page being served at `/about` on your instance. See the [custom pages documentation](https://datasette.readthedocs.io/en/0.41/custom_templates.html#custom-pages) for full details, including how to return custom HTTP headers, redirects and status codes. (#648) [Configuration directory mode](https://datasette.readthedocs.io/en/0.41/config.html#config-dir) (#731) allows you to define a custom Datasette instance as a directory. So instead of running the following: $ datasette one.db two.db \ --metadata.json \ --template-dir=templates/ \ --plugins-dir=plugins \ --static css:css You can instead arrange your files in a single directory called `my-project` and run this: $ datasette my-project/ Also in this release: - New `NOT LIKE` table filter: `?colname__notlike=expression`. (#750) - Datasette now has a *pattern portfolio* at `/-/patterns` - e.g. . This is a page that shows every Datasette user interface component in one place, to aid core development and people building custom CSS themes. (#151) - SQLite [PRAGMA functions](https://www.sqlite.org/pragma.html#pragfunc) such as `pragma_table_info(tablename)` are now allowed in Datasette SQL queries. (#761) - Datasette pages now consistently return a `content-type` of `text/html; charset=utf-8""`. (#752) - Datasette now handles an ASGI `raw_path` value of `None`, which should allow compatibilty with the [Mangum](https://github.com/erm/mangum) adapter for running ASGI apps on AWS Lambda. Thanks, Colin Dellow. (#719) - Installation documentation now covers how to [Install using pipx](https://datasette.readthedocs.io/en/0.41/installation.html#installation-pipx). (#756) - Improved the documentation for [Full-text search](https://datasette.readthedocs.io/en/0.41/full_text_search.html#full-text-search).",107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.42,26320774,MDc6UmVsZWFzZTI2MzIwNzc0,0.42,master,0.42,0,9599,simonw,0,2020-05-08T17:38:27Z,2020-05-08T17:56:36Z,"A small release which provides improved internal methods for use in plugins, along with documentation. See #685. * Added documentation for `db.execute()`, see [await db.execute(sql, ...)](https://datasette.readthedocs.io/en/stable/internals.html#database-execute). * Renamed `db.execute_against_connection_in_thread()` to `db.execute_fn()` and made it a documented method, see [await db.execute_fn(fn)](https://datasette.readthedocs.io/en/stable/internals.html#database-execute-fn). * New `results.first()` and `results.single_value()` methods, plus documentation for the `Results` class - see [Results](https://datasette.readthedocs.io/en/stable/internals.html#database-results). ",107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.43,26994005,MDc6UmVsZWFzZTI2OTk0MDA1,0.43,master,0.43,0,9599,simonw,0,2020-05-28T14:11:06Z,2020-05-28T14:39:18Z,"The main focus of this release is a major upgrade to the [register_output_renderer(datasette)](https://datasette.readthedocs.io/en/stable/plugins.html#plugin-register-output-renderer) plugin hook, which allows plugins to provide new output formats for Datasette such as [datasette-atom](https://github.com/simonw/datasette-atom) and [datasette-ics](https://github.com/simonw/datasette-ics). - Redesign of [register_output_renderer(datasette)](https://datasette.readthedocs.io/en/stable/plugins.html#plugin-register-output-renderer) to provide more context to the render callback and support an optional `""can_render""` callback that controls if a suggested link to the output format is provided. ([#581](https://github.com/simonw/datasette/issues/581), [#770](https://github.com/simonw/datasette/issues/770)) - Visually distinguish float and integer columns - useful for figuring out why order-by-column might be returning unexpected results. ([#729](https://github.com/simonw/datasette/issues/729)) - The [Request object](https://datasette.readthedocs.io/en/stable/internals.html#internals-request), which is passed to several plugin hooks, is now documented. ([#706](https://github.com/simonw/datasette/issues/706)) - New `metadata.json` option for setting a custom default page size for specific tables and views, see [Setting a custom page size](https://datasette.readthedocs.io/en/stable/metadata.html#metadata-page-size). ([#751](https://github.com/simonw/datasette/issues/751)) - Canned queries can now be configured with a default URL fragment hash, useful when working with plugins such as [datasette-vega](https://github.com/simonw/datasette-vega), see [Setting a default fragment](https://datasette.readthedocs.io/en/stable/sql_queries.html#canned-queries-default-fragment). ([#706](https://github.com/simonw/datasette/issues/706)) - Fixed a bug in `datasette publish` when running on operating systems where the `/tmp` directory lives in a different volume, using a backport of the Python 3.8 `shutil.copytree()` function. ([#744](https://github.com/simonw/datasette/issues/744)) - Every plugin hook is now covered by the unit tests, and a new unit test checks that each plugin hook has at least one corresponding test. ([#771](https://github.com/simonw/datasette/issues/771), [#773](https://github.com/simonw/datasette/issues/773))",107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.44,27483276,MDc6UmVsZWFzZTI3NDgzMjc2,0.44,master,0.44,0,9599,simonw,0,2020-06-12T01:19:30Z,2020-06-12T07:10:38Z,"Authentication and permissions, writable canned queries, flash messages, new plugin hooks and more. [Full release notes](https://datasette.readthedocs.io/en/stable/changelog.html#v0-44). See also [Datasette 0.44: the annotated release notes](https://simonwillison.net/2020/Jun/12/annotated-release-notes/).",107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.45a0,27703093,MDc6UmVsZWFzZTI3NzAzMDkz,0.45a0,master,0.45a0,0,9599,simonw,1,2020-06-18T20:58:09Z,2020-06-18T21:14:00Z,,107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.45a1,27707079,MDc6UmVsZWFzZTI3NzA3MDc5,0.45a1,master,0.45a1,0,9599,simonw,1,2020-06-18T23:52:16Z,2020-06-19T00:02:29Z,,107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.45a2,27856779,MDc6UmVsZWFzZTI3ODU2Nzc5,0.45a2,master,0.45a2,0,9599,simonw,1,2020-06-24T04:17:30Z,2020-06-24T04:32:12Z,,107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.45a3,27994774,MDc6UmVsZWFzZTI3OTk0Nzc0,0.45a3,master,0.45a3,0,9599,simonw,1,2020-06-28T03:22:49Z,2020-06-28T03:27:12Z,,107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.45a4,28008549,MDc6UmVsZWFzZTI4MDA4NTQ5,0.45a4,master,0.45a4,0,9599,simonw,1,2020-06-29T02:31:16Z,2020-06-29T02:33:02Z,,107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.45a5,28097766,MDc6UmVsZWFzZTI4MDk3NzY2,0.45a5,master,0.45a5,0,9599,simonw,1,2020-07-01T04:25:35Z,2020-07-01T04:27:08Z,,107914493,datasette, https://github.com/simonw/datasette/releases/tag/0.45,28134124,MDc6UmVsZWFzZTI4MTM0MTI0,0.45,master,0.45,0,9599,simonw,0,2020-07-01T21:43:07Z,2020-07-01T21:46:07Z,"Magic parameters for canned queries, a log out feature, improved plugin documentation and four new plugin hooks. ### Magic parameters for canned queries Canned queries now support [Magic parameters](https://docs.datasette.io/en/stable/sql_queries.html#canned-queries-magic-parameters), which can be used to insert or select automatically generated values. For example: ```sql insert into logs (user_id, timestamp) values (:_actor_id, :_now_datetime_utc) ``` This inserts the currently authenticated actor ID and the current datetime. ([#842](https://github.com/simonw/datasette/issues/842)) ### Log out The [ds_actor cookie](https://docs.datasette.io/en/stable/authentication.html#authentication-ds-actor) can be used by plugins (or by Datasette's [--root mechanism](https://docs.datasette.io/en/stable/authentication.html#authentication-root)) to authenticate users. The new `/-/logout` page provides a way to clear that cookie. A ""Log out"" button now shows in the global navigation provided the user is authenticated using the `ds_actor` cookie. ([#840](https://github.com/simonw/datasette/issues/840)) ### Better plugin documentation The plugin documentation has been re-arranged into four sections, including a brand new section on testing plugins. ([#687](https://github.com/simonw/datasette/issues/687)) - [Plugins](https://docs.datasette.io/en/stable/plugins.html#plugins) introduces Datasette's plugin system and describes how to install and configure plugins. - [Writing plugins](https://docs.datasette.io/en/stable/writing_plugins.html#writing-plugins) describes how to author plugins, from simple one-off plugins to packaged plugins that can be published to PyPI. It also describes how to start a plugin using the new [datasette-plugin](https://github.com/simonw/datasette-plugin) cookiecutter template. - [Plugin hooks](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hooks) is a full list of detailed documentation for every Datasette plugin hook. - [Testing plugins](https://docs.datasette.io/en/stable/testing_plugins.html#testing-plugins) describes how to write tests for Datasette plugins, using [pytest](https://docs.pytest.org/) and [HTTPX](https://www.python-httpx.org/). ### New plugin hooks - [register_magic_parameters(datasette)](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-register-magic-parameters) can be used to define new types of magic canned query parameters. - [startup(datasette)](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-startup) can run custom code when Datasette first starts up. [datasette-init](https://github.com/simonw/datasette-init) is a new plugin that uses this hook to create database tables and views on startup if they have not yet been created. ([#834](https://github.com/simonw/datasette/issues/834)) - [canned_queries(datasette, database, actor)](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-canned-queries) lets plugins provide additional canned queries beyond those defined in Datasette's metadata. See [datasette-saved-queries](https://github.com/simonw/datasette-saved-queries) for an example of this hook in action. ([#852](https://github.com/simonw/datasette/issues/852)) - [forbidden(datasette, request, message)](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-forbidden) is a hook for customizing how Datasette responds to 403 forbidden errors. ([#812](https://github.com/simonw/datasette/issues/812)) ### Smaller changes - Cascading view permissons - so if a user has `view-table` they can view the table page even if they do not have `view-database` or `view-instance`. ([#832](https://github.com/simonw/datasette/issues/832)) - CSRF protection no longer applies to `Authentication: Bearer token` requests or requests without cookies. ([#835](https://github.com/simonw/datasette/issues/835)) - `datasette.add_message()` now works inside plugins. ([#864](https://github.com/simonw/datasette/issues/864)) - Workaround for ""Too many open files"" error in test runs. ([#846](https://github.com/simonw/datasette/issues/846)) - Respect existing `scope[""actor""]` if already set by ASGI middleware. ([#854](https://github.com/simonw/datasette/issues/854)) - New process for shipping [Alpha and beta releases](https://docs.datasette.io/en/stable/contributing.html#contributing-alpha-beta). ([#807](https://github.com/simonw/datasette/issues/807)) - `{{ csrftoken() }}` now works when plugins render a template using `datasette.render_template(..., request=request)`. ([#863](https://github.com/simonw/datasette/issues/863)) - Datasette now creates a single [Request object](https://docs.datasette.io/en/stable/internals.html#internals-request) and uses it throughout the lifetime of the current HTTP request. ([#870](https://github.com/simonw/datasette/issues/870))",107914493,datasette,