# releases

html_url: https://github.com/simonw/google-drive-to-sqlite/releases/tag/0.1a0
node_id: RE_kwDOG2hQNs4Dj7Jb
tag_name: 0.1a0
target_commitish: main
name: 0.1a0
created_at: 2022-02-16T22:14:25Z
published_at: 2022-02-16T22:18:21Z
body:
  This initial alpha release may not work for anyone other than me, as Google still need to verify my OAuth application.

  - `google-drive-to-sqlite auth` command for authenticating with Google and storing the resulting credentials. [#2](https://github.com/simonw/google-drive-to-sqlite/issues/2)
  - `google-drive-to-sqlite files` command for fetching file metadata from Google Drive and storing it in a SQLite database file, or outputting it as JSON. [#7](https://github.com/simonw/google-drive-to-sqlite/issues/7)
  - `google-drive-to-sqlite get` command for executing other authenticated API calls against Google APIs. [#3](https://github.com/simonw/google-drive-to-sqlite/issues/3)


html_url: https://github.com/simonw/google-drive-to-sqlite/releases/tag/0.1a1
node_id: RE_kwDOG2hQNs4DkBdx
tag_name: 0.1a1
target_commitish: main
name: 0.1a1
created_at: 2022-02-17T06:49:50Z
published_at: 2022-02-17T06:52:55Z
body:
  - New `google-drive-to-sqlite download` command, [documented here](https://github.com/simonw/google-drive-to-sqlite/blob/0.1a1/README.md#google-drive-to-sqlite-download-file_id). [#4](https://github.com/simonw/google-drive-to-sqlite/issues/4)
  - Fixed bug where `google-drive-to-sqlite get` threw an error if retrieving non-JSON output. [#13](https://github.com/simonw/google-drive-to-sqlite/issues/13)
  - Increased timeout to 30s. [#8](https://github.com/simonw/google-drive-to-sqlite/issues/8)


html_url: https://github.com/eyeseast/datasette-geojson-map/releases/tag/v0.4.0
node_id: RE_kwDOFtPpRM4DkT8L
tag_name: v0.4.0
target_commitish: main
name: Simple styles
created_at: 2022-02-17T21:11:54Z
published_at: 2022-02-17T21:13:38Z
body:
  ## What's Changed

  * Basic simplestyle implementation in https://github.com/eyeseast/datasette-geojson-map/pull/7 Maps can now be styled using the [simplestyle-spec](https://github.com/mapbox/simplestyle-spec/tree/master/1.1.0). See README for examples.

  **Full Changelog**: https://github.com/eyeseast/datasette-geojson-map/compare/v0.3.1...v0.4.0


html_url: https://github.com/simonw/google-drive-to-sqlite/releases/tag/0.2a0
node_id: RE_kwDOG2hQNs4DkaSP
tag_name: 0.2a0
target_commitish: main
name: 0.2a0
created_at: 2022-02-18T06:33:21Z
published_at: 2022-02-18T06:36:07Z
body:
  - New `google-drive-to-sqlite revoke` command, for revoking stored credentials. [#16](https://github.com/simonw/google-drive-to-sqlite/issues/16)
  - If an hour long `access_token` expires while a command is running, the failed request is retried with a new token automatically generated using the `refresh_token`. [#11](https://github.com/simonw/google-drive-to-sqlite/issues/11)


html_url: https://github.com/simonw/google-drive-to-sqlite/releases/tag/0.3
node_id: RE_kwDOG2hQNs4DkzLG
tag_name: 0.3
target_commitish: main
name: 0.3
created_at: 2022-02-19T21:36:14Z
published_at: 2022-02-19T21:37:13Z
body:
  - New design for the database schema: [#9](https://github.com/simonw/google-drive-to-sqlite/issues/9)
    - `drive_files` contains files, with a `_parent` foreign key to the parent folder
    - `drive_folders` contains folders, with a self-referential `_parent` foreign key
    - `drive_users` contains users who may own or have modified files
    - `drive_folders_owners` relates folders to their owners
    - `drive_files_owners` relates files to their owners
    - The full schema is now included [in the documentation](https://github.com/simonw/google-drive-to-sqlite/blob/0.3/README.md#database-schema).
  - New `--import-json` and `--import-nl` options to the `files` command for creating a database using JSON data retrieved previously using the `--nl` and `--json` options. [#20](https://github.com/simonw/google-drive-to-sqlite/issues/20)
  - `--starred`, `--trashed` and `--shared-with-me` options for `files` as shortcuts for constructing more advanced search queries. [#25](https://github.com/simonw/google-drive-to-sqlite/issues/25)
  - Documentation now has a [quickstart section](https://github.com/simonw/google-drive-to-sqlite/blob/0.3/README.md#quickstart). [#24](https://github.com/simonw/google-drive-to-sqlite/issues/24)


html_url: https://github.com/simonw/google-drive-to-sqlite/releases/tag/0.4
node_id: RE_kwDOG2hQNs4Dk5Sc
tag_name: 0.4
target_commitish: main
name: 0.4
created_at: 2022-02-20T20:12:45Z
published_at: 2022-02-20T20:12:49Z
body:
  - Redesigned [the schema](https://github.com/simonw/google-drive-to-sqlite/blob/0.4/README.md#database-schema) to reflect that Google Drive files can only have one, not multiple owners. [#34](https://github.com/simonw/google-drive-to-sqlite/issues/34)
    - Removed `drive_folders_owners` and `drive_files_owners` tables.
    - `drive_files` and `drive_folders` now have a `_owner` column that is a foreign key to `drive_users`.
  - New [google-drive-to-sqlite export format file_id](https://github.com/simonw/google-drive-to-sqlite/blob/0.4/README.md#google-drive-to-sqlite-export-format-file_id) command for exporting Google Docs files as different formats such as `pdf`. [#21](https://github.com/simonw/google-drive-to-sqlite/issues/21)
  - New options to `files`: `--apps` for all Google Docs files of all types, or `--docs`, `--sheets`, `--presentations` and `--drawings` for Google Docs files of specific types.
  - `google-drive-to-sqlite files` and `get` commands now have a `--verbose` option showing what the tool is doing in detail.
  - Automatically retries up to twice on HTTP transport errors, with a 2 second delay. [#18](https://github.com/simonw/google-drive-to-sqlite/issues/18)
  - The `auth.json` file now defaults to `0600` permissions, meaning only the user can read that file on a shared system. [#37](https://github.com/simonw/google-drive-to-sqlite/issues/37)


html_url: https://github.com/simonw/sqlite-diffable/releases/tag/0.2.1
node_id: RE_kwDOC6Gvzs4Dk7P-
tag_name: 0.2.1
target_commitish: main
name: 0.2.1
created_at: 2022-02-21T02:28:25Z
published_at: 2022-02-21T02:29:45Z
body:
  - README now includes a description of the file format and a link to a demo. [#5](https://github.com/simonw/sqlite-diffable/issues/5)


html_url: https://github.com/simonw/datasette-render-markdown/releases/tag/2.1
node_id: RE_kwDODSffFs4Dm8zQ
tag_name: 2.1
target_commitish: main
name: 2.1
created_at: 2022-02-26T18:20:54Z
published_at: 2022-02-26T18:22:00Z
body:
  - Fixed bug where potential URLs inside of `<pre>` links were being turned into links. [#11](https://github.com/simonw/datasette-render-markdown/issues/11)


html_url: https://github.com/simonw/datasette-dateutil/releases/tag/0.3
node_id: RE_kwDOEdSSqc4DnakE
tag_name: 0.3
target_commitish: main
name: 0.3
created_at: 2022-03-01T00:21:06Z
published_at: 2022-03-01T00:22:13Z
body:
  - The `dateutil_parse()`, `dateutil_parse_fuzzy()`, `dateutil_parse_dayfirst()` and `dateutil_parse_fuzzy_dayfirst()` functions all now accept an optional second argument specifying a "default" datetime to consider if some of the details are missing. [#5](https://github.com/simonw/datasette-dateutil/issues/5)


html_url: https://github.com/eyeseast/geocode-sqlite/releases/tag/v0.5.2
node_id: RE_kwDOEXxXas4DnsA9
tag_name: v0.5.2
target_commitish: main
name: Fix bug updating rowid tables
created_at: 2022-03-01T19:48:05Z
published_at: 2022-03-01T19:49:19Z
body:
  ## What's Changed
  * Require click >= 7.0 to hide commands by @1-Byte in https://github.com/eyeseast/geocode-sqlite/pull/20
  * Fix error with rowid tables by @eyeseast in https://github.com/eyeseast/geocode-sqlite/pull/27


  **Full Changelog**: https://github.com/eyeseast/geocode-sqlite/compare/v0.5.1...v0.5.2


html_url: https://github.com/simonw/sqlite-utils/releases/tag/3.25
node_id: RE_kwDOCGYnMM4Dn0qf
tag_name: 3.25
target_commitish: main
name: 3.25
created_at: 2022-03-02T06:34:46Z
published_at: 2022-03-02T06:35:18Z
updated_at: 2022-03-02T06:35:18Z
body:
  -   New `hash_id_columns=` parameter for creating a primary key that's a hash of the content of specific columns - see [Setting an ID based on the hash of the row contents](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-hash) for details. ([#343](https://github.com/simonw/sqlite-utils/issues/343))
  -   New [db.sqlite_version](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-sqlite-version) property, returning a tuple of integers representing the version of SQLite, for example `(3, 38, 0)`.
  -   Fixed a bug where [register_function(deterministic=True)](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-register-function) caused errors on versions of SQLite prior to 3.8.3. ([#408](https://github.com/simonw/sqlite-utils/issues/408))
  -   New documented [hash_record(record, keys=...)](https://sqlite-utils.datasette.io/en/stable/reference.html#reference-utils-hash-record) function.


html_url: https://github.com/simonw/geojson-to-sqlite/releases/tag/1.0
node_id: RE_kwDODiU8M84DohI6
tag_name: 1.0
target_commitish: main
name: 1.0
created_at: 2022-03-04T02:12:12Z
published_at: 2022-03-04T02:14:16Z
body:
  - New `--properties` option for writing GeoJSON properties to a JSON column called `properties` - or use `--properties=props` to write to a column called `props`. Thanks, [Chris Amico](https://github.com/eyeseast). [#25](https://github.com/simonw/geojson-to-sqlite/issues/25)


html_url: https://github.com/simonw/django-sql-dashboard/releases/tag/1.0.2
node_id: RE_kwDOFLLS6s4Dp4b4
tag_name: 1.0.2
target_commitish: main
name: 1.0.2
created_at: 2022-03-08T19:58:44Z
published_at: 2022-03-08T20:00:13Z
body:
  - Fixed a bug where queries that returned an array containing dates (or other objects without a defined Python JSON serialization) would result in a 500 error. [#146](https://github.com/simonw/django-sql-dashboard/issues/146)


html_url: https://github.com/simonw/shot-scraper/releases/tag/0.1
node_id: RE_kwDOG-A5W84DqR9l
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2022-03-09T19:13:44Z
published_at: 2022-03-09T19:16:43Z
updated_at: 2022-03-09T19:16:43Z
body:
  - Switched from npm Playwright to [Python Playwright](https://pypi.org/project/playwright/). [#3](https://github.com/simonw/shot-scraper/issues/3)
  - New `shot-scraper install` command for installing the browser needed by Playwright. [#6](https://github.com/simonw/shot-scraper/issues/6)
  - New `shot-scraper shot URL` command (also the default if you just run `shot-scraper ...`) which takes a single screenshot. [#5](https://github.com/simonw/shot-scraper/issues/5)
  - `shot-scraper multi shots.yml` command now executes the YAML file with a list of shots in it.


html_url: https://github.com/simonw/shot-scraper/releases/tag/0.2
node_id: RE_kwDOG-A5W84DqUf7
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2022-03-09T21:05:31Z
published_at: 2022-03-09T21:05:41Z
updated_at: 2022-03-09T21:05:41Z
body:
  - `shot-scraper --selector SELECTOR` option to specify an element on the page using a CSS selector and take a screenshot of just that element. [#8](https://github.com/simonw/shot-scraper/issues/8)
  - `selector: ...` key in YAML file to specify an element by CSS selector.
  - `--javascript SCRIPT` option to specify custom JavaScript to be executed after the page has loaded but before the screenshot is taken. [#12](https://github.com/simonw/shot-scraper/issues/12)
  - `javascript:` key in YAML to specify JavaScript to execute.
  - `--width` and `--height` options to set the width and height of the browser window used for the screenshot. If a height is specified, the resulting screenshot will be that height rather than being the full height of the page. [#13](https://github.com/simonw/shot-scraper/issues/13)
  - Equivalent `width:` and `height:` keys in the YAML configuration.


html_url: https://github.com/simonw/shot-scraper/releases/tag/0.3
node_id: RE_kwDOG-A5W84DqYBD
tag_name: 0.3
target_commitish: main
name: 0.3
created_at: 2022-03-09T22:22:57Z
published_at: 2022-03-09T22:24:53Z
updated_at: 2022-03-09T22:24:53Z
body:
  - Added a live demo, in the [shot-scraper-demo](https://github.com/simonw/shot-scraper-demo) repository. [#14](https://github.com/simonw/shot-scraper/issuse/14)
  - New `--quality 80` option for outputting smaller JPEG images with the specified quality. [#15](https://github.com/simonw/shot-scraper/issuse/15)
  - New `--wait 2000` option for waiting the specified number of milliseconds before taking the screenshot. [#16](https://github.com/simonw/shot-scraper/issuse/16)


html_url: https://github.com/simonw/shot-scraper/releases/tag/0.4
node_id: RE_kwDOG-A5W84Dqx7v
tag_name: 0.4
target_commitish: main
name: 0.4
created_at: 2022-03-10T22:33:48Z
published_at: 2022-03-10T22:33:51Z
updated_at: 2022-03-10T22:33:51Z
body:
  - Added `shot-scraper accessibility URL` command, which dumps out a JSON copy of the Chromium accessibility tree for the page. [#22](https://github.com/simonw/shot-scraper/issues/22)
  - Fixed error in the `--help` output for the `shot-scraper multi` command.


html_url: https://github.com/eyeseast/geocode-sqlite/releases/tag/v0.6.0
node_id: RE_kwDOEXxXas4DrEJU
tag_name: v0.6.0
target_commitish: main
name: GeoJSON and SpatiaLite support
created_at: 2022-03-11T16:57:57Z
published_at: 2022-03-11T16:58:49Z
body:
  ## What's Changed
  * GeoJSON and SpatiaLite support by @eyeseast in https://github.com/eyeseast/geocode-sqlite/pull/23


  **Full Changelog**: https://github.com/eyeseast/geocode-sqlite/compare/v0.5.2...v0.6.0


html_url: https://github.com/simonw/sqlite-utils/releases/tag/3.25.1
node_id: RE_kwDOCGYnMM4DrGEG
tag_name: 3.25.1
target_commitish: main
name: 3.25.1
created_at: 2022-03-11T18:34:44Z
published_at: 2022-03-11T18:35:41Z
updated_at: 2022-03-11T18:35:41Z
body:
  - Improved display of type information and parameters in the [API reference documentation](https://sqlite-utils.datasette.io/en/stable/reference.html). [#413](https://github.com/simonw/sqlite-utils/issues/413)


html_url: https://github.com/simonw/shot-scraper/releases/tag/0.5
node_id: RE_kwDOG-A5W84DrS4K
tag_name: 0.5
target_commitish: main
name: 0.5
created_at: 2022-03-12T19:10:11Z
published_at: 2022-03-12T19:17:00Z
updated_at: 2022-03-12T19:17:00Z
body:
  - New `shot-scraper pdf` command for creating a PDF export of a web page. [#24](https://github.com/simonw/shot-scraper/issues/24)
  - `shot-scraper accessibility --javascript` option for executing custom JavaScript before taking the accessibility snapshot. [#23](https://github.com/simonw/shot-scraper/issues/23)
  - `shot-scraper accessibility -o filename.json` option. [#25](https://github.com/simonw/shot-scraper/issues/25)
  - README demos section now links to `@newshomepages` Twitter bot by [@palewire](https://github.com/palewire)
  - README now includes tips on executing JavaScript. [#20](https://github.com/simonw/shot-scraper/issues/20)
  - README now includes the `--help` output of the various commands.


html_url: https://github.com/simonw/shot-scraper/releases/tag/0.6
node_id: RE_kwDOG-A5W84DrTu_
tag_name: 0.6
target_commitish: main
name: 0.6
created_at: 2022-03-12T21:29:07Z
published_at: 2022-03-12T21:30:32Z
updated_at: 2022-03-14T07:02:52Z
body:
  - Now supports taking screenshots of **pages that require authentication**. [#18](https://github.com/simonw/shot-scraper/issues/18)

    The following command will open a browser window for the specified website, wait for you to manually authenticate and hit `<enter>` in the terminal, and then write the resulting authentication context out to `auth.json`:

        shot-scraper auth https://github.com/ auth.json`

    You can then take authenticated screenshots like this:

        shot-scraper https://github.com/notifications \
          --auth auth.json -o notifications.png

    The `-a/--auth` option is also supported by the `multi`, `pdf` and `accessibility` commands.

  - The `shot-scraper` command can now open a browser in which you can **interact with a page** before the screenshot is taken: [#31](https://github.com/simonw/shot-scraper/issues/31)

        shot-scraper https://simonwillison.net/ \
          -o after-interaction.png \
          --height 800 --interactive

    This will output:

        Hit <enter> to take the shot and close the browser window:
          # And after you hit <enter>...
        Screenshot of 'https://simonwillison.net/' written to 'after-interaction.png'

  - You can now pass **multiple CSS selectors** in order to take a screenshot of the smallest area that encompasses all of the content referenced by those selectors: [#21](https://github.com/simonw/shot-scraper/issues/21)

        shot-scraper https://simonwillison.net/ \
          -s '#bighead' -s .overband \
          -o bighead-multi-selector.png

    Add `--padding 20` to include an additional 20px of padding around the specified area.

    The YAML format used by `snap-shotter multi` also now supports multiple CSS selectors, which look like this:

    ```yaml
    - output: bighead-multi-selector.png
      url: https://simonwillison.net/
      selectors:
      - "#bighead"
      - .overband
      padding: 20
    ```

  - Scripted tests can now be run using `tests/run_examples.sh` [#29](https://github.com/simonw/shot-scraper/issues/29)


html_url: https://github.com/simonw/shot-scraper/releases/tag/0.7
node_id: RE_kwDOG-A5W84DrWLv
tag_name: 0.7
target_commitish: main
name: 0.7
created_at: 2022-03-13T04:46:58Z
published_at: 2022-03-13T04:49:36Z
updated_at: 2022-03-13T04:49:36Z
body:
  - The `shot-scraper shot` and `shot-scraper pdf` commands both now default to writing a file to disk if no filename is specified, using a name derived from the URL. If you want to write the PNG or PDF content to standard output you can do so using `-o -`. [#32](https://github.com/simonw/shot-scraper/issues/32)
  - New `--retina` flag for `shot-scraper shot` and `shot-scraper multi` which causes the screenshot to be taken with a device scale factor of 2. [#33](https://github.com/simonw/shot-scraper/issues/33)
  - `shot-scraper shot --devtools` option opens an interactive browser window with the browser developer tools enabled. [#34](https://github.com/simonw/shot-scraper/issues/34)


html_url: https://github.com/simonw/shot-scraper/releases/tag/0.8
node_id: RE_kwDOG-A5W84DrZlH
tag_name: 0.8
target_commitish: main
name: 0.8
created_at: 2022-03-13T17:02:55Z
published_at: 2022-03-13T17:05:21Z
updated_at: 2022-03-13T17:05:21Z
body:
  - `shot-scraper` can now take screenshots of local files on disk: [#35](https://github.com/simonw/shot-scraper/issues/35)

        shot-scraper index.html -o index.png

  - If you call `shot-scraper` on a URL with no protocol, `http://` will be assumed. Redirects will be followed:

        shot-scraper datasette.io -o datasette.png


html_url: https://github.com/simonw/shot-scraper/releases/tag/0.9
node_id: RE_kwDOG-A5W84DrblZ
tag_name: 0.9
target_commitish: main
name: 0.9
created_at: 2022-03-13T23:59:19Z
published_at: 2022-03-14T00:05:56Z
updated_at: 2022-03-14T00:05:56Z
body:
  - New [shot-scraper javascript](https://github.com/simonw/shot-scraper/blob/0.9/README.md#scraping-pages-using-javascript) command for executing JavaScript against a web page and returning the result to the console as JSON: [#38](https://github.com/simonw/shot-scraper/issues/38)

        % shot-scraper javascript datasette.io document.title
        "Datasette: An open source multi-tool for exploring and publishing data"

    This can be used for web scraping and data extraction. Any JavaScript errors will cause the command to return an exit code of 1, so this can also be used to run tests against a website from within a continuous integration environment such as GitHub Actions.

  - The `shot-scraper pdf` and `shot-scraper accessibility` commands can both now be used with local files in addition to URLs. [#37](https://github.com/simonw/shot-scraper/issues/37)
  - The `output:` key is no longer required in YAML shot configuration: if omitted, an automatic filename will be used instead. [#40](https://github.com/simonw/shot-scraper/issues/40)
  - An empty YAML file no longer produces an error. [#41](https://github.com/simonw/shot-scraper/issues/41)


html_url: https://github.com/simonw/datasette-publish-vercel/releases/tag/0.12.1
node_id: RE_kwDODx4htM4DsSms
tag_name: 0.12.1
target_commitish: main
name: 0.12.1
created_at: 2022-03-15T23:08:52Z
published_at: 2022-03-15T23:10:09Z
body:
  - Fixed bug where the `invoke_startup()` method was not being called on startup, which caused Datasette plugins using [the startup() plugin hook](https://docs.datasette.io/en/stable/plugin_hooks.html#startup-datasette) to break. [#54](https://github.com/simonw/datasette-publish-vercel/issues/54)


html_url: https://github.com/eyeseast/geocode-sqlite/releases/tag/v0.6.1
node_id: RE_kwDOEXxXas4DsUY9
tag_name: v0.6.1
target_commitish: main
name: v0.6.1
created_at: 2022-03-16T01:38:54Z
published_at: 2022-03-16T01:40:34Z
body:
  ## What's Changed
  * if no bbox options are passed, `value` is None by @noslouch in https://github.com/eyeseast/geocode-sqlite/pull/30
  * Pass --api-key to mapbox test by @eyeseast in https://github.com/eyeseast/geocode-sqlite/pull/33

  ## New Contributors
  * @noslouch made their first contribution in https://github.com/eyeseast/geocode-sqlite/pull/30

  **Full Changelog**: https://github.com/eyeseast/geocode-sqlite/compare/v0.6.0...v0.6.1


html_url: https://github.com/simonw/datasette-hashed-urls/releases/tag/0.2
node_id: RE_kwDOHAjKFc4DsW0m
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2022-03-16T04:35:16Z
published_at: 2022-03-16T04:35:26Z
body:
  - The URL for a cached database file is now `/fixtures-aa7318b` - previously it used an underscore. This ensures compatibility with existing installations that had used Datasette's now deprecated [hashed URL mode](https://docs.datasette.io/en/0.60.2/performance.html#hashed-url-mode). [#3](https://github.com/simonw/datasette-hashed-urls/issues/3)
  - The `max-age` in the cache header can nowbe configured using the `max_age` plugin configuration setting. [#6](https://github.com/simonw/datasette-hashed-urls/issues/6)
  - Cache header is now `cache-control: max-age=31536000, public` - which has been tested with the cache provided by [Vercel](https://vercel.com/). [#4](https://github.com/simonw/datasette-hashed-urls/issues/4)


html_url: https://github.com/simonw/datasette/releases/tag/0.61a0
node_id: RE_kwDOBm6k_c4DtgJY
tag_name: 0.61a0
target_commitish: main
name: 0.61a0
created_at: 2022-03-20T01:14:40Z
published_at: 2022-03-20T01:16:41Z
updated_at: 2022-03-20T01:16:41Z
body:
  -   Removed hashed URL mode from Datasette. The new `datasette-hashed-urls` plugin can be used to achieve the same result, see [datasette-hashed-urls](https://docs.datasette.io/en/latest/performance.html#performance-hashed-urls) for details. ([#1661](https://github.com/simonw/datasette/issues/1661))
  -   Databases can now have a custom path within the Datasette instance that is indpendent of the database name, using the `db.route` property. ([#1668](https://github.com/simonw/datasette/issues/1668))
  -   URLs within Datasette now use a different encoding scheme for tables or databases that include "special" characters outside of the range of `a-zA-Z0-9_-`. This scheme is explained here: [Tilde encoding](https://docs.datasette.io/en/latest/internals.html#internals-tilde-encoding). ([#1657](https://github.com/simonw/datasette/issues/1657))
  -   Table and row HTML pages now include a `<link rel="alternate" type="application/json+datasette" href="...">` element and return a `Link: URL; rel="alternate"; type="application/json+datasette"` HTTP header pointing to the JSON version of those pages. ([#1533](https://github.com/simonw/datasette/issues/1533))
  -   `Access-Control-Expose-Headers: Link` is now added to the CORS headers, allowing remote JavaScript to access that header.
  -   Canned queries are now shown at the top of the database page, directly below the SQL editor. Previously they were shown at the bottom, below the list of tables. ([#1612](https://github.com/simonw/datasette/issues/1612))
  -   Datasette now has a default favicon. ([#1603](https://github.com/simonw/datasette/issues/1603))
  -   `sqlite_stat` tables are now hidden by default. ([#1587](https://github.com/simonw/datasette/issues/1587))
  -   SpatiaLite tables `data_licenses`, `KNN` and `KNN2` are now hidden by default. ([#1601](https://github.com/simonw/datasette/issues/1601))
  -   Python 3.6 is no longer supported. ([#1577](https://github.com/simonw/datasette/issues/1577))
  -   Tests now run against Python 3.11-dev. ([#1621](https://github.com/simonw/datasette/issues/1621))
  -   Fixed bug where [custom pages](https://docs.datasette.io/en/latest/custom_templates.html#custom-pages) did not work on Windows. Thanks, Robert Christie. ([#1545](https://github.com/simonw/datasette/issues/1545))
  -   SQL query tracing mechanism now works for queries executed in `asyncio` sub-tasks, such as those created by `asyncio.gather()`. ([#1576](https://github.com/simonw/datasette/issues/1576))
  -   [datasette.tracer](https://docs.datasette.io/en/latest/internals.html#internals-tracer) mechanism is now documented.
  -   Common Datasette symbols can now be imported directly from the top-level `datasette` package, see [Import shortcuts](https://docs.datasette.io/en/latest/internals.html#internals-shortcuts). Those symbols are `Response`, `Forbidden`, `NotFound`, `hookimpl`, `actor_matches_allow`. ([#957](https://github.com/simonw/datasette/issues/957))
  -   `/-/versions` page now returns additional details for libraries used by SpatiaLite. ([#1607](https://github.com/simonw/datasette/issues/1607))
  -   Documentation now links to the [Datasette Tutorials](https://datasette.io/tutorials).
  -   Datasette will now also look for SpatiaLite in `/opt/homebrew` - thanks, Dan Peterson. ([#1649](https://github.com/simonw/datasette/pull/1649))
  -   Datasette is now covered by a [Code of Conduct](https://github.com/simonw/datasette/blob/main/CODE_OF_CONDUCT.md). ([#1654](https://github.com/simonw/datasette/issues/1654))


html_url: https://github.com/simonw/datasette-publish-vercel/releases/tag/0.13
node_id: RE_kwDODx4htM4DtgXq
tag_name: 0.13
target_commitish: main
name: 0.13
created_at: 2022-03-20T02:00:38Z
published_at: 2022-03-20T02:01:52Z
body:
  - New `--crossdb` option for publishing a Datasette instance that has [cross-database queries](https://docs.datasette.io/en/stable/sql_queries.html) enabled. [#55](https://github.com/simonw/datasette-publish-vercel/issues/55)


html_url: https://github.com/simonw/datasette/releases/tag/0.61
node_id: RE_kwDOBm6k_c4Du1X7
tag_name: 0.61
target_commitish: main
name: 0.61
created_at: 2022-03-23T18:12:26Z
published_at: 2022-03-23T18:14:36Z
updated_at: 2022-03-24T01:56:06Z
body:
  In preparation for Datasette 1.0, this release includes two potentially backwards-incompatible changes. Hashed URL mode has been moved to a separate plugin, and the way Datasette generates URLs to databases and tables with special characters in their name such as `/` and `.` has changed.

  Datasette also now requires Python 3.7 or higher.

  See also the [annotated release notes](https://simonwillison.net/2022/Mar/24/datasette-061/).

  -   URLs within Datasette now use a different encoding scheme for tables or databases that include "special" characters outside of the range of `a-zA-Z0-9_-`. This scheme is explained here: [Tilde encoding](https://docs.datasette.io/en/stable/internals.html#internals-tilde-encoding). ([#1657](https://github.com/simonw/datasette/issues/1657))
  -   Removed hashed URL mode from Datasette. The new `datasette-hashed-urls` plugin can be used to achieve the same result, see [datasette-hashed-urls](https://docs.datasette.io/en/stable/performance.html#performance-hashed-urls) for details. ([#1661](https://github.com/simonw/datasette/issues/1661))
  -   Databases can now have a custom path within the Datasette instance that is independent of the database name, using the `db.route` property. ([#1668](https://github.com/simonw/datasette/issues/1668))
  -   Datasette is now covered by a [Code of Conduct](https://github.com/simonw/datasette/blob/main/CODE_OF_CONDUCT.md). ([#1654](https://github.com/simonw/datasette/issues/1654))
  -   Python 3.6 is no longer supported. ([#1577](https://github.com/simonw/datasette/issues/1577))
  -   Tests now run against Python 3.11-dev. ([#1621](https://github.com/simonw/datasette/issues/1621))
  -   New [datasette.ensure_permissions(actor, permissions)](https://docs.datasette.io/en/stable/internals.html#datasette-ensure-permissions) internal method for checking multiple permissions at once. ([#1675](https://github.com/simonw/datasette/issues/1675))
  -   New [datasette.check_visibility(actor, action, resource=None)](https://docs.datasette.io/en/stable/internals.html#datasette-check-visibilty) internal method for checking if a user can see a resource that would otherwise be invisible to unauthenticated users. ([#1678](https://github.com/simonw/datasette/issues/1678))
  -   Table and row HTML pages now include a `<link rel="alternate" type="application/json+datasette" href="...">` element and return a `Link: URL; rel="alternate"; type="application/json+datasette"` HTTP header pointing to the JSON version of those pages. ([#1533](https://github.com/simonw/datasette/issues/1533))
  -   `Access-Control-Expose-Headers: Link` is now added to the CORS headers, allowing remote JavaScript to access that header.
  -   Canned queries are now shown at the top of the database page, directly below the SQL editor. Previously they were shown at the bottom, below the list of tables. ([#1612](https://github.com/simonw/datasette/issues/1612))
  -   Datasette now has a default favicon. ([#1603](https://github.com/simonw/datasette/issues/1603))
  -   `sqlite_stat` tables are now hidden by default. ([#1587](https://github.com/simonw/datasette/issues/1587))
  -   SpatiaLite tables `data_licenses`, `KNN` and `KNN2` are now hidden by default. ([#1601](https://github.com/simonw/datasette/issues/1601))
  -   SQL query tracing mechanism now works for queries executed in `asyncio` sub-tasks, such as those created by `asyncio.gather()`. ([#1576](https://github.com/simonw/datasette/issues/1576))
  -   [datasette.tracer](https://docs.datasette.io/en/stable/internals.html#internals-tracer) mechanism is now documented.
  -   Common Datasette symbols can now be imported directly from the top-level `datasette` package, see [Import shortcuts](https://docs.datasette.io/en/stable/internals.html#internals-shortcuts). Those symbols are `Response`, `Forbidden`, `NotFound`, `hookimpl`, `actor_matches_allow`. ([#957](https://github.com/simonw/datasette/issues/957))
  -   `/-/versions` page now returns additional details for libraries used by SpatiaLite. ([#1607](https://github.com/simonw/datasette/issues/1607))
  -   Documentation now links to the [Datasette Tutorials](https://datasette.io/tutorials).
  -   Datasette will now also look for SpatiaLite in `/opt/homebrew` - thanks, Dan Peterson. ([#1649](https://github.com/simonw/datasette/pull/1649))
  -   Fixed bug where [custom pages](https://docs.datasette.io/en/stable/custom_templates.html#custom-pages) did not work on Windows. Thanks, Robert Christie. ([#1545](https://github.com/simonw/datasette/issues/1545))
  -   Fixed error caused when a table had a column named `n`. ([#1228](https://github.com/simonw/datasette/issues/1228))


html_url: https://github.com/simonw/datasette/releases/tag/0.61.1
node_id: RE_kwDOBm6k_c4Du4TC
tag_name: 0.61.1
target_commitish: main
name: 0.61.1
created_at: 2022-03-23T18:54:10Z
published_at: 2022-03-23T20:31:09Z
updated_at: 2022-03-23T20:31:09Z
body:
  - Fixed a bug where databases with a different route from their name (as used by the [datasette-hashed-urls plugin](https://datasette.io/plugins/datasette-hashed-urls)) returned errors when executing custom SQL queries. ([#1682](https://github.com/simonw/datasette/issues/1682))


html_url: https://github.com/simonw/datasette-hashed-urls/releases/tag/0.3
node_id: RE_kwDOHAjKFc4Du4jE
tag_name: 0.3
target_commitish: main
name: 0.3
created_at: 2022-03-23T20:40:29Z
published_at: 2022-03-23T20:42:49Z
body:
  - Now depends on [Datasette 0.61.1](https://docs.datasette.io/en/stable/changelog.html#v0-61-1)
  - Fixes several bugs: [#9](https://github.com/simonw/datasette-hashed-urls/issues/9), [#10](https://github.com/simonw/datasette-hashed-urls/issues/10), [#12](https://github.com/simonw/datasette-hashed-urls/issues/12), [#13](https://github.com/simonw/datasette-hashed-urls/issues/13) - thanks for the QA, Forest Gregg.


html_url: https://github.com/simonw/datasette-hashed-urls/releases/tag/0.3.1
node_id: RE_kwDOHAjKFc4Du9om
tag_name: 0.3.1
target_commitish: main
name: 0.3.1
created_at: 2022-03-24T03:22:55Z
published_at: 2022-03-24T03:23:43Z
body:
  - Fixed a bug where the necessary CORS headers were not included with the redirects. [#14](https://github.com/simonw/datasette-hashed-urls/issues/14)


html_url: https://github.com/simonw/datasette-hashed-urls/releases/tag/0.4
node_id: RE_kwDOHAjKFc4DvQrA
tag_name: 0.4
target_commitish: main
name: 0.4
created_at: 2022-03-24T17:54:52Z
published_at: 2022-03-24T20:52:04Z
body:
  - If run with Datasette's `--crossdb` option to enable [cross-database queries](https://docs.datasette.io/en/stable/sql_queries.html#cross-database-queries) the `/_memory` database now gains a hash that is the combined hash of all of the attached immutable databases. [Example query](https://datasette-hashed-urls.vercel.app/_memory?sql=select+*+from+fixtures.facetable+union+all+select+*+from+fixtures2.facetable). [#15](https://github.com/simonw/datasette-hashed-urls/issues/15)


html_url: https://github.com/simonw/datasette-packages/releases/tag/0.1
node_id: RE_kwDOHENadM4DvpDN
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2022-03-25T22:04:04Z
published_at: 2022-03-25T22:05:51Z
updated_at: 2022-03-25T22:05:51Z
body:
  - Initial release. `/-/packages` shows a list of installed Python packages, `/-/packages.json` returns that same list as JSON.


html_url: https://github.com/simonw/datasette-packages/releases/tag/0.1.1
node_id: RE_kwDOHENadM4DvpKE
tag_name: 0.1.1
target_commitish: main
name: 0.1.1
created_at: 2022-03-25T22:16:17Z
published_at: 2022-03-25T22:17:21Z
updated_at: 2022-03-25T22:22:48Z
body:
  - Fixed bug where plugin would raise a 500 error when installed with some other plugins. [#2](https://github.com/simonw/datasette-packages/issues/2)


html_url: https://github.com/hydrosquall/datasette-nteract-data-explorer/releases/tag/0.1.0
node_id: RE_kwDOHEflbM4DvxfT
tag_name: 0.1.0
target_commitish: main
name: 0.1.0 - Initial Release
created_at: 2022-03-27T00:22:35Z
published_at: 2022-03-27T00:33:21Z
body:
  First release! May not work in browsers that don't use ESModules. Feedback and bug reports are welcome.

  **Full Changelog**: https://github.com/hydrosquall/datasette-nteract-data-explorer/commits/0.1.0


html_url: https://github.com/hydrosquall/datasette-nteract-data-explorer/releases/tag/0.2.0
node_id: RE_kwDOHEflbM4DvxuL
tag_name: 0.2.0
target_commitish: main
name: 0.2.0 - With Statics
created_at: 2022-03-27T01:32:15Z
published_at: 2022-03-27T01:33:44Z
body:
  The first release worked with local development, but was not building new JS in CI. This release should fix that.

  **Full Changelog**: https://github.com/hydrosquall/datasette-nteract-data-explorer/compare/0.1.0...0.2.0


html_url: https://github.com/hydrosquall/datasette-nteract-data-explorer/releases/tag/0.2.3
node_id: RE_kwDOHEflbM4Dvx6r
tag_name: 0.2.3
target_commitish: main
name: 0.2.3 - Separate JS and Python build folders
created_at: 2022-03-27T02:20:42Z
published_at: 2022-03-27T02:21:47Z
body:
  The build systems from python and JS were interfering with each other. This should fix that.

  **Full Changelog**: https://github.com/hydrosquall/datasette-nteract-data-explorer/compare/0.2.2...0.2.3


html_url: https://github.com/simonw/datasette-auth0/releases/tag/0.1
node_id: RE_kwDOHEfRqM4Dv45e
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2022-03-28T02:49:05Z
published_at: 2022-03-28T03:04:52Z
body:
  - Now includes a live demo, see [datasette-auth0-demo.datasette.io](https://datasette-auth0-demo.datasette.io/) [#1](https://github.com/simonw/datasette-auth0/issues/1)


html_url: https://github.com/simonw/shot-scraper/releases/tag/0.10
node_id: RE_kwDOG-A5W84DwQdf
tag_name: 0.10
target_commitish: main
name: 0.10
created_at: 2022-03-29T00:25:29Z
published_at: 2022-03-29T00:25:33Z
updated_at: 2022-03-29T00:25:33Z
body:
  - New `-b/--browser` option for the `shot-scraper install`, `shot`, `multi` and `javascript` commands. This can be used to install and run alternative browsers `firefox`, `chrome` or `chrome-beta`. Thanks, [Ben Welsh](https://github.com/palewire). [#53](https://github.com/simonw/shot-scraper/issues/53)
  - New `--timeout` option for `shot-scraper shot` and `shot-scraper multi`. Thanks, [Ben Welsh](https://github.com/palewire). [#47](https://github.com/simonw/shot-scraper/pull/47)
  - `shot-scraper multi` now continues to create other shots despite a timeout error, unless `--fail-on-error` is passed. Thanks, [Ryan Cheley](https://github.com/ryancheley). [#50](https://github.com/simonw/shot-scraper/issues/50)
  - README now describes the `async () => { ... }` pattern for `shot-scraper javascript`, as discussed in [Extracting web page content using Readability.js and shot-scraper](https://til.simonwillison.net/shot-scraper/readability).
  - New demo: [shot-scraper-template](https://github.com/simonw/shot-scraper-template), which lets you setup shot-scraper running in a GitHub repository in a single click. [See also Instantly create a GitHub repository to take screenshots of a web page](https://simonwillison.net/2022/Mar/14/shot-scraper-template/).
  - New scraping demo: [scrape-hacker-news-by-domain](https://github.com/simonw/scrape-hacker-news-by-domain) uses `shot-scraper javascript` to scrape a web page. See [Scraping web pages from the command-line with shot-scraper](https://simonwillison.net/2022/Mar/14/scraping-web-pages-shot-scraper/).


html_url: https://github.com/simonw/pypi-to-sqlite/releases/tag/0.1
node_id: RE_kwDOHI-jK84Dz3jp
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2022-04-07T23:40:43Z
published_at: 2022-04-07T23:43:55Z
body:
  - Initial release, with `pypi-to-sqlite pypi.db datasette sqlite-utils` command. [#1](https://github.com/simonw/pypi-to-sqlite/issues/1)


html_url: https://github.com/simonw/pypi-to-sqlite/releases/tag/0.2
node_id: RE_kwDOHI-jK84D0EUb
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2022-04-08T14:47:07Z
published_at: 2022-04-08T14:48:21Z
body:
  - New `--prefix prefix` option for creating tables with a prefix - so `pypi-to-sqlite data.db datasette --prefix pypi_` will create tables called `pypi_packages`, `pypi_versions` and `pypi_releases`. [#6](https://github.com/simonw/pypi-to-sqlite/issues/6)


html_url: https://github.com/simonw/pypi-to-sqlite/releases/tag/0.2.2
node_id: RE_kwDOHI-jK84D0E2e
tag_name: 0.2.2
target_commitish: main
name: 0.2.2
created_at: 2022-04-08T15:11:36Z
published_at: 2022-04-08T15:12:05Z
body:
  - Fixed a bug where the command could not be safely run more than once against the same database file. [#7](https://github.com/simonw/pypi-to-sqlite/issues/7)


html_url: https://github.com/simonw/shot-scraper/releases/tag/0.11
node_id: RE_kwDOG-A5W84D0J5S
tag_name: 0.11
target_commitish: main
name: 0.11
created_at: 2022-04-08T20:02:26Z
published_at: 2022-04-08T20:06:57Z
updated_at: 2022-04-08T20:06:57Z
body:
  - New `shot-scraper accessibility --timeout` option, thanks [Ben Welsh](https://github.com/palewire). [#59](https://github.com/simonw/shot-scraper/pull/59)
  - `shot-scraper auth --browser` option for authentication using a browser other than Chromium. [#61](https://github.com/simonw/shot-scraper/issues/61)
  - Using `--quality` now results in a JPEG file with the correct `.jpg` extension. Thanks, [Ian Wootten](https://github.com/iwootten). [#58](https://github.com/simonw/shot-scraper/pull/58)
  - New `--reduced-motion` flag for emulating the "prefers-reduced-motion" media feature. Thanks, [Ryan Murphy](https://github.com/rdmurphy). [#49](https://github.com/simonw/shot-scraper/issues/49)

reactions:
  {"url": "https://api.github.com/repos/simonw/shot-scraper/releases/64003666/reactions", "total_count": 6, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 2, "rocket": 2, "eyes": 2}


html_url: https://github.com/simonw/shot-scraper/releases/tag/0.12
node_id: RE_kwDOG-A5W84D0t_M
tag_name: 0.12
target_commitish: main
name: 0.12
created_at: 2022-04-11T19:32:44Z
published_at: 2022-04-11T19:32:50Z
updated_at: 2022-04-11T19:32:50Z
body:
  - `--selector-all` option to take a screenshot that encompasses every element matching the specified CSS selector - complements `--selector` which takes a screenshot of just the first element matching that selector. See [Specifying elements using JavaScript filters](https://github.com/simonw/shot-scraper/blob/0.12/README.md#specifying-elements-using-javascript-filters). [#64](https://github.com/simonw/shot-scraper/issues/64)
  - `selector_all:` and `selectors_all:` keys in the `shot-scraper multi` YAML format.
  - `--js-selector` and `--js-selector-all` options for specifying elements to screenshot using a JavaScript expression, for cases which cannot be handled using CSS selectors [#43](https://github.com/simonw/shot-scraper/issues/43). The following example takes a screenshot of the first paragraph on the page that mentions `shot-scraper`:
      ```
      shot-scraper https://github.com/simonw/shot-scraper \
        --js-selector 'el.tagName == "P" && el.innerText.includes("shot-scraper")'
      ```
  - `js_selector:`, `js_selectors:`, `js_selector_all:` and `js_selectors_all:` equivalent keys in the `shot-scraper multi` YAML format.
  - `--user-agent` option for setting a custom user agent header. [#63](https://github.com/simonw/shot-scraper/issues/63)
  - `--browser webkit` option for running [WebKit](https://playwright.dev/docs/browsers#webkit) - thanks, [Ryan Murphy](https://github.com/rdmurphy). [#56](https://github.com/simonw/shot-scraper/pull/56)


html_url: https://github.com/simonw/geojson-to-sqlite/releases/tag/1.0.1
node_id: RE_kwDODiU8M84D01J2
tag_name: 1.0.1
target_commitish: main
name: 1.0.1
created_at: 2022-04-12T02:21:26Z
published_at: 2022-04-12T02:22:01Z
body:
  - Fixed bug where `--spatialite` option failed with an error if the GeoJSON features being loaded consisted of just a geometry with no properties. [#30](https://github.com/simonw/geojson-to-sqlite/issues/30)


html_url: https://github.com/simonw/geojson-to-sqlite/releases/tag/1.1
node_id: RE_kwDODiU8M84D1X4A
tag_name: 1.1
target_commitish: main
name: 1.1
created_at: 2022-04-13T04:55:59Z
published_at: 2022-04-13T05:00:09Z
body:
  - Command can now accept more than one GeoJSON file. The contents of all of the files will be inserted into the same table. [#21](https://github.com/simonw/geojson-to-sqlite/issues/21)
  - Using the `--spatial-index` option against the same database twice no longer triggers an error.
  - Now depends on [sqlite-utils 3.23](https://sqlite-utils.datasette.io/en/stable/changelog.html#v3-23) on higher, taking advantage of the SpatiaLite utilities in that library. Thanks, [Chris Amico](https://github.com/eyeseast). [#28](https://github.com/simonw/geojson-to-sqlite/issues/28)


html_url: https://github.com/simonw/sqlite-utils/releases/tag/3.26
node_id: RE_kwDOCGYnMM4D1uRS
tag_name: 3.26
target_commitish: main
name: 3.26
created_at: 2022-04-13T22:51:48Z
published_at: 2022-04-13T22:53:36Z
updated_at: 2022-04-13T22:53:36Z
body:
  -   New `errors=r.IGNORE/r.SET_NULL` parameter for the `r.parsedatetime()` and `r.parsedate()` [convert recipes](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-convert-recipes). ([#416](https://github.com/simonw/sqlite-utils/issues/416))
  -   Fixed a bug where `--multi` could not be used in combination with `--dry-run` for the [convert](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-convert) command. ([#415](https://github.com/simonw/sqlite-utils/issues/415))
  -   New documentation: [Using a convert() function to execute initialization](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-convert-complex). ([#420](https://github.com/simonw/sqlite-utils/issues/420))
  -   More robust detection for whether or not `deterministic=True` is supported. ([#425](https://github.com/simonw/sqlite-utils/issues/425))


html_url: https://github.com/simonw/geojson-to-sqlite/releases/tag/1.1.1
node_id: RE_kwDODiU8M84D1urd
tag_name: 1.1.1
target_commitish: main
name: 1.1.1
created_at: 2022-04-13T23:37:53Z
published_at: 2022-04-13T23:39:25Z
body:
  - Fixed a bug where a `_tmp` column remained after importing a geometry with no additional properties. [#30](https://github.com/simonw/geojson-to-sqlite/issues/30)
  - Added `--version` option to show the current installed version of the tool. [#32](https://github.com/simonw/geojson-to-sqlite/issues/32)


html_url: https://github.com/hydrosquall/datasette-nteract-data-explorer/releases/tag/0.3.1
node_id: RE_kwDOHEflbM4D2Zan
tag_name: 0.3.1
target_commitish: main
name: 0.3.1 - Custom SQL Queries, Published Demo
created_at: 2022-04-16T23:16:34Z
published_at: 2022-04-16T23:18:58Z
body:
  ## What's Changed

  * feature: enable data explorer to activate when writing custom SQL by @hydrosquall in https://github.com/hydrosquall/datasette-nteract-data-explorer/pull/5
  * docs: replace browser history example with happy planet index dataset by @hydrosquall in https://github.com/hydrosquall/datasette-nteract-data-explorer/pull/6
  * build: deploy demo site to vercel by @hydrosquall in https://github.com/hydrosquall/datasette-nteract-data-explorer/pull/8
  * release: 0.3.0 by @hydrosquall in https://github.com/hydrosquall/datasette-nteract-data-explorer/pull/11

  **Full Changelog**: https://github.com/hydrosquall/datasette-nteract-data-explorer/compare/0.2.1...0.3.1


html_url: https://github.com/simonw/shot-scraper/releases/tag/0.13
node_id: RE_kwDOG-A5W84D2rqd
tag_name: 0.13
target_commitish: main
name: 0.13
created_at: 2022-04-18T18:21:30Z
published_at: 2022-04-18T18:29:46Z
updated_at: 2022-04-18T18:29:46Z
body:
  - `shot-scraper auth --devtools` option for opening DevTools when authenticating with a site. [#66](https://github.com/simonw/shot-scraper/issues/66)
  - `shot-scraper multi -n/--no-clobber` option for skipping screenshots where the output image already exists on disk. [#70](https://github.com/simonw/shot-scraper/issues/70)


html_url: https://github.com/simonw/django-sql-dashboard/releases/tag/1.1
node_id: RE_kwDOFLLS6s4D3Llv
tag_name: 1.1
target_commitish: main
name: 1.1
created_at: 2022-04-20T00:23:41Z
published_at: 2022-04-20T00:24:47Z
body:
  - `<br>` tag is now supported in HTML output. [#150](https://github.com/simonw/django-sql-dashboard/issues/150)


html_url: https://github.com/simonw/datasette-total-page-time/releases/tag/0.1
node_id: RE_kwDOHPc0N84D5hc6
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2022-04-26T22:10:20Z
published_at: 2022-04-26T22:11:48Z
body:
  - Initial implementation. Installing this plugin adds a "Page took 38.310ms" note to the Datasette footer.


html_url: https://github.com/simonw/datasette-gzip/releases/tag/0.1
node_id: RE_kwDOHPj_Zs4D52JT
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2022-04-27T17:25:10Z
published_at: 2022-04-27T17:27:49Z
updated_at: 2022-04-27T17:27:49Z
body:
  - Initial release. Adds gzip support to Datasette, respecting the `Accept-Encoding` HTTP header. A thin wrapper around the [GZipMiddleware](https://www.starlette.io/middleware/#gzipmiddleware) from Starlette.


html_url: https://github.com/simonw/datasette-gzip/releases/tag/0.2
node_id: RE_kwDOHPj_Zs4D6Pgo
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2022-04-28T16:05:18Z
published_at: 2022-04-28T16:06:51Z
updated_at: 2022-04-28T16:06:51Z
body:
  - No longer includes [Starlette](https://www.starlette.io/) as a dependency. Now uses [asgi-gzip](https://github.com/simonw/asgi-gzip), a smaller package which extracts the `GZipMiddleware` class from Starlette. [#2](https://github.com/simonw/datasette-gzip/issues/2)


html_url: https://github.com/simonw/datasette-copy-to-memory/releases/tag/0.1a0
node_id: RE_kwDOHQLzfc4D6VCd
tag_name: 0.1a0
target_commitish: main
name: 0.1a0
created_at: 2022-04-28T20:03:43Z
published_at: 2022-04-28T20:05:30Z
body:
  - Initial prototype: copies each attached database file to an in-memory database on startup. [#1](https://github.com/simonw/datasette-copy-to-memory/issues/1)


html_url: https://github.com/simonw/datasette-copy-to-memory/releases/tag/0.1a1
node_id: RE_kwDOHQLzfc4D6VwF
tag_name: 0.1a1
target_commitish: main
name: 0.1a1
created_at: 2022-04-28T20:47:24Z
published_at: 2022-04-28T20:48:43Z
body:
  - [Plugin configuration](https://github.com/simonw/datasette-copy-to-memory/blob/0.1a1/README.md#configuration) can now be used to select specific databases to be copied into memory on startup. [#2](https://github.com/simonw/datasette-copy-to-memory/issues/2)


html_url: https://github.com/simonw/datasette-copy-to-memory/releases/tag/0.1a2
node_id: RE_kwDOHQLzfc4D6WCj
tag_name: 0.1a2
target_commitish: main
name: 0.1a2
created_at: 2022-04-28T21:06:25Z
published_at: 2022-04-28T21:07:09Z
body:
  - Fixed crash when attempting to load an immutable database. [#3](https://github.com/simonw/datasette-copy-to-memory/issues/3)


html_url: https://github.com/simonw/datasette-copy-to-memory/releases/tag/0.1a3
node_id: RE_kwDOHQLzfc4D6Wn-
tag_name: 0.1a3
target_commitish: main
name: 0.1a3
created_at: 2022-04-28T21:47:08Z
published_at: 2022-04-28T21:48:59Z
body:
  - Fixed a bug where the plugin would generate unnecessary `file:...` files every time it ran. [#4](https://github.com/simonw/datasette-copy-to-memory/issues/4)
  - Plugin now has a live demo running on [latest-with-plugins.datasette.io/fixtures_memory](https://latest-with-plugins.datasette.io/fixtures_memory). [#5](https://github.com/simonw/datasette-copy-to-memory/issues/5)


html_url: https://github.com/simonw/datasette-copy-to-memory/releases/tag/0.2
node_id: RE_kwDOHQLzfc4D6yVB
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2022-04-30T19:47:07Z
published_at: 2022-04-30T19:49:29Z
body:
  - New `replace: true` plugin configuration option for replacing the file database with the in-memory one, rather than adding a new `/db_memory` route that duplicates that database. [#6](https://github.com/simonw/datasette-copy-to-memory/issues/6)


html_url: https://github.com/simonw/s3-credentials/releases/tag/0.11
node_id: RE_kwDOGUV9is4D65Ld
tag_name: 0.11
target_commitish: main
name: 0.11
created_at: 2022-05-01T22:33:02Z
published_at: 2022-05-01T22:36:13Z
updated_at: 2022-05-01T22:36:13Z
body:
  - New `set-cors-policy` and `get-cors-policy` for altering the CORS policy for a bucket, [documented here](https://github.com/simonw/s3-credentials/blob/0.11/README.md#set-cors-policy-and-get-cors-policy). [#47](https://github.com/simonw/s3-credentials/issues/47)
  - Each command now shows example usage in `--help`. [#67](https://github.com/simonw/s3-credentials/issues/67)
  - New [documentation page](https://github.com/simonw/s3-credentials/blob/main/help.md) listing the `--help` for every command.

reactions:
  {"url": "https://api.github.com/repos/simonw/s3-credentials/releases/65770205/reactions", "total_count": 1, "+1": 0, "-1": 0, "laugh": 0, "hooray": 1, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/sqlite-utils/releases/tag/3.26.1
node_id: RE_kwDOCGYnMM4D7IuS
tag_name: 3.26.1
target_commitish: main
name: 3.26.1
created_at: 2022-05-02T18:17:19Z
published_at: 2022-05-02T18:18:01Z
updated_at: 2022-05-02T18:18:01Z
body:
  - Now depends on [click-default-group-wheel](https://github.com/simonw/click-default-group-wheel), a pure Python wheel package. This means you can install and use this package with [Pyodide](https://pyodide.org/), which can run Python entirely in your browser using WebAssembly. ([#429](https://github.com/simonw/sqlite-utils/pull/429))

    Try that out using the [Pyodide REPL](https://pyodide.org/en/stable/console.html):

    ```pycon
    >>> import micropip
    >>> await micropip.install("sqlite-utils")
    >>> import sqlite_utils
    >>> db = sqlite_utils.Database(memory=True)
    >>> list(db.query("select 3 * 5"))
    [{'3 * 5': 15}]
    ```

reactions:
  {"url": "https://api.github.com/repos/simonw/sqlite-utils/releases/65833874/reactions", "total_count": 1, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 1, "eyes": 0}


html_url: https://github.com/simonw/datasette/releases/tag/0.62a0
node_id: RE_kwDOBm6k_c4D7ME1
tag_name: 0.62a0
target_commitish: main
name: 0.62a0
created_at: 2022-05-02T21:38:34Z
published_at: 2022-05-02T21:39:52Z
updated_at: 2022-05-02T21:39:52Z
body:
  -   Datasette now runs some SQL queries in parallel. This has limited impact on performance, see [this research issue](https://github.com/simonw/datasette/issues/1727) for details.
  -   Datasette should now be compatible with Pyodide. ([#1733](https://github.com/simonw/datasette/issues/1733))
  -   `datasette publish cloudrun` has a new `--timeout` option which can be used to increase the time limit applied by the Google Cloud build environment. Thanks, Tim Sherratt. ([#1717](https://github.com/simonw/datasette/pull/1717))
  -   Spaces in database names are now encoded as `+` rather than `~20`. ([#1701](https://github.com/simonw/datasette/issues/1701))
  -   `<Binary: 2427344 bytes>` is now displayed as `<Binary: 2,427,344 bytes>` and is accompanied by tooltip showing "2.3MB". ([#1712](https://github.com/simonw/datasette/issues/1712))
  -   Don't show the facet option in the cog menu if faceting is not allowed. ([#1683](https://github.com/simonw/datasette/issues/1683))
  -   Code examples in the documentation are now all formatted using Black. ([#1718](https://github.com/simonw/datasette/issues/1718))
  -   `Request.fake()` method is now documented, see [Request object](https://docs.datasette.io/en/latest/internals.html#internals-request).


html_url: https://github.com/simonw/datasette-insert/releases/tag/0.7
node_id: RE_kwDOELgXO84D_mRl
tag_name: 0.7
target_commitish: main
name: 0.7
created_at: 2022-05-16T18:43:10Z
published_at: 2022-05-16T18:45:09Z
body:
  - New `/-/upsert/db/table?pk=id` API endpoint for performing upserts, where partial JSON documents can be provided and those keys will be updated on existing row or used to create new rows if a matching row does not exist. [#9](https://github.com/simonw/datasette-insert/issues/9)


html_url: https://github.com/simonw/datasette-upload-dbs/releases/tag/0.1
node_id: RE_kwDOHSfuMs4D_shq
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2022-05-17T03:05:00Z
published_at: 2022-05-17T03:06:55Z
updated_at: 2022-05-17T03:06:55Z
body:
  - Initial release. Authorized users can upload new SQLite database files to Datasette - they will be stored, served and will persist across server restarts. [#1](https://github.com/simonw/datasette-upload-dbs/issues/1)


html_url: https://github.com/simonw/datasette-upload-dbs/releases/tag/0.1.1
node_id: RE_kwDOHSfuMs4D_s5N
tag_name: 0.1.1
target_commitish: main
name: 0.1.1
created_at: 2022-05-17T03:51:19Z
published_at: 2022-05-17T03:52:31Z
updated_at: 2022-05-17T03:52:31Z
body:
  - Fixed bug where file name field continued to be displayed during the upload. [#3](https://github.com/simonw/datasette-upload-dbs/issues/3)
  - Fixed bug where errors displayed using JavaScript did not provide an easy path to trying the upload again. [#4](https://github.com/simonw/datasette-upload-dbs/issues/4)


html_url: https://github.com/simonw/shot-scraper/releases/tag/0.14
node_id: RE_kwDOG-A5W84EA3Ib
tag_name: 0.14
target_commitish: main
name: 0.14
created_at: 2022-05-19T23:43:37Z
published_at: 2022-05-19T23:45:02Z
updated_at: 2022-05-20T00:02:10Z
body:
  - Documentation is now hosted at **[shot-scraper.datasette.io](https://shot-scraper.datasette.io/)** and has been expanded to multiple pages. [#73](https://github.com/simonw/shot-scraper/issues/73)
  - `shot-scraper $URL --wait-for EXPRESSION` can be used to take the screenshot only once the provided JavaScript expression returns `true`. See [Waiting until a specific condition](https://shot-scraper.datasette.io/en/stable/screenshots.html#waiting-until-a-specific-condition). [#72](https://github.com/simonw/shot-scraper/issues/72)
  - The `wait_for:` key in the YAML format used by `shot-scraper multi` provides equivalent functionality for scripted multiple screenshots.
  - New documentation on [Using shot-scraper with GitHub Actions](https://shot-scraper.datasette.io/en/stable/github-actions.html). [#74](https://github.com/simonw/shot-scraper/issues/74)
  - New example: [Extracting page content with Readability.js](https://shot-scraper.datasette.io/en/stable/javascript.html#example-extracting-page-content-with-readability-js)


html_url: https://github.com/simonw/shot-scraper/releases/tag/0.14.1
node_id: RE_kwDOG-A5W84EBcrs
tag_name: 0.14.1
target_commitish: main
name: 0.14.1
created_at: 2022-05-22T14:22:50Z
published_at: 2022-05-22T14:24:06Z
updated_at: 2022-05-22T14:24:06Z
body:
  - Switched [documentation site](https://shot-scraper.datasette.io/) over to the [Furo](https://github.com/pradyunsg/furo) theme. [#77](https://github.com/simonw/shot-scraper/issues/77)


html_url: https://github.com/simonw/datasette-auth-existing-cookies/releases/tag/1.0a0
node_id: RE_kwDODhLDp84EDxCY
tag_name: 1.0a0
target_commitish: main
name: 1.0a0
created_at: 2022-05-29T15:12:11Z
published_at: 2022-05-29T15:15:37Z
body:
  This alpha release breaks backwards compatibility, and completely redesigns how this plugin works. [#13](https://github.com/simonw/datasette-auth-existing-cookies/issues/13)

  - Plugin now uses the [actor_from_request()](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-actor-from-request) plugin hook
  - Implementation is greatly simplified: the forbidden mechanism and redirect to login via a signed `next=` parameter components have been removed
  - Plugin configuration settings have been renamed, see [the README](https://github.com/simonw/datasette-auth-existing-cookies/blob/1.0a0/README.md#configuration)


html_url: https://github.com/simonw/datasette-auth-existing-cookies/releases/tag/1.0a1
node_id: RE_kwDODhLDp84EDxui
tag_name: 1.0a1
target_commitish: main
name: 1.0a1
created_at: 2022-05-29T17:37:30Z
published_at: 2022-05-29T17:38:24Z
body:
  - Fix for bug: `AttributeError: 'Datasette' object has no attribute '_auth_existing_cookies_cache'` [#19](https://github.com/simonw/datasette-auth-existing-cookies/issues/19)


html_url: https://github.com/simonw/datasette-graphql/releases/tag/2.0.2
node_id: RE_kwDOEPNYIc4EEFoU
tag_name: 2.0.2
target_commitish: main
name: 2.0.2
created_at: 2022-05-30T18:21:50Z
published_at: 2022-05-30T18:23:05Z
updated_at: 2022-05-30T18:23:05Z
body:
  - Upgrade dependencies to `graphene>=3.1.0` and `graphql-core>=3.2.1`. [#88](https://github.com/simonw/datasette-graphql/pull/88)


html_url: https://github.com/simonw/datasette-upload-csvs/releases/tag/0.7
node_id: RE_kwDODf8oPs4EFjuQ
tag_name: 0.7
target_commitish: main
name: 0.7
created_at: 2022-06-03T15:28:57Z
published_at: 2022-06-03T15:30:55Z
updated_at: 2022-06-03T15:30:55Z
body:
  - Now requires and is compatible with `datasette>=0.61`. [#21](https://github.com/simonw/datasette-upload-csvs/issues/21)
  - Dropped support for Python 3.6


html_url: https://github.com/simonw/datasette-upload-csvs/releases/tag/0.7.1
node_id: RE_kwDODf8oPs4EHlKF
tag_name: 0.7.1
target_commitish: main
name: 0.7.1
created_at: 2022-06-09T19:38:14Z
published_at: 2022-06-09T19:40:01Z
updated_at: 2022-06-09T19:40:01Z
body:
  - Fixed bug where request would block while upload was being processed. [#22](https://github.com/simonw/datasette-upload-csvs/issues/22)
  - CSV files that use an encoding other than `utf-8` are now supported. [#23](https://github.com/simonw/datasette-upload-csvs/issues/23)
  - Errors during import are now displayed to the user. [#24](https://github.com/simonw/datasette-upload-csvs/issues/24)


html_url: https://github.com/simonw/datasette-socrata/releases/tag/0.1
node_id: RE_kwDOHeFHys4EHm8e
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2022-06-09T21:24:07Z
published_at: 2022-06-09T21:24:37Z
body:
  - Initial release. Adds a `/-/import-socrata` page which can be used to import data by providing the URL to a dataset on Socrata. [#1](https://github.com/simonw/datasette-socrata/issues/1)


html_url: https://github.com/simonw/datasette-socrata/releases/tag/0.1.1
node_id: RE_kwDOHeFHys4EH617
tag_name: 0.1.1
target_commitish: main
name: 0.1.1
created_at: 2022-06-10T18:53:37Z
published_at: 2022-06-10T18:54:22Z
body:
  - Fixed bug where error messages relating to incorrect configuration were served as 403 forbidden. [#9](https://github.com/simonw/datasette-socrata/issues/9)


html_url: https://github.com/simonw/datasette-ics/releases/tag/0.5.1
node_id: RE_kwDODoa7Dc4EH-Cl
tag_name: 0.5.1
target_commitish: main
name: 0.5.1
created_at: 2022-06-10T22:52:34Z
published_at: 2022-06-10T22:54:54Z
body:
  - Added [live demo](https://github.com/simonw/datasette-ics/blob/0.5.1/README.md#demo) and screenshot to the documentation. [#5](https://github.com/simonw/datasette-ics/issues/5)


html_url: https://github.com/simonw/datasette-socrata/releases/tag/0.2
node_id: RE_kwDOHeFHys4EIDOD
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2022-06-11T15:54:03Z
published_at: 2022-06-11T15:54:55Z
body:
  - Table metadata in Datasette now reflects metadata imported from Socrata. [#11](https://github.com/simonw/datasette-socrata/issues/11)


html_url: https://github.com/simonw/sqlite-utils/releases/tag/3.27
node_id: RE_kwDOCGYnMM4EJDTY
tag_name: 3.27
target_commitish: main
name: 3.27
created_at: 2022-06-15T04:30:47Z
published_at: 2022-06-15T04:34:45Z
updated_at: 2022-06-19T03:29:48Z
body:
  See also [the annotated release notes](https://simonwillison.net/2022/Jun/19/weeknotes/#sqlite-utils-3-27) for this release.

  -   Documentation now uses the [Furo](https://github.com/pradyunsg/furo) Sphinx theme. ([#435](https://github.com/simonw/sqlite-utils/issues/435))
  -   Code examples in documentation now have a "copy to clipboard" button. ([#436](https://github.com/simonw/sqlite-utils/issues/436))
  -   `sqlite_utils.utils.utils.rows_from_file()` is now a documented API, see [Reading rows from a file](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-rows-from-file). ([#443](https://github.com/simonw/sqlite-utils/issues/443))
  -   `rows_from_file()` has two new parameters to help handle CSV files with rows that contain more values than are listed in that CSV file's headings: `ignore_extras=True` and `extras_key="name-of-key"`. ([#440](https://github.com/simonw/sqlite-utils/issues/440))
  -   `sqlite_utils.utils.maximize_csv_field_size_limit()` helper function for increasing the field size limit for reading CSV files to its maximum, see [Setting the maximum CSV field size limit](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-maximize-csv-field-size-limit). ([#442](https://github.com/simonw/sqlite-utils/issues/442))
  -   `table.search(where=, where_args=)` parameters for adding additional `WHERE` clauses to a search query. The `where=` parameter is available on `table.search_sql(...)` as well. See [Searching with table.search()](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-fts-search). ([#441](https://github.com/simonw/sqlite-utils/issues/441))
  -   Fixed bug where `table.detect_fts()` and other search-related functions could fail if two FTS-enabled tables had names that were prefixes of each other. ([#434](https://github.com/simonw/sqlite-utils/issues/434))


html_url: https://github.com/simonw/datasette-socrata/releases/tag/0.3
node_id: RE_kwDOHeFHys4EKD4G
tag_name: 0.3
target_commitish: main
name: 0.3
created_at: 2022-06-17T20:25:42Z
published_at: 2022-06-17T20:29:53Z
body:
  - Any errors that occur during an import are now stored in the `errors` column of the `socrata_imports` table, and displayed by the JavaScript progress indicator. [#12](https://github.com/simonw/datasette-socrata/issues/12)
  - CSV imports with long field values no longer trigger an error. [#13](https://github.com/simonw/datasette-socrata/issues/13)
  - Progress bars now show the number of records imported and remaining, and hint to refresh the page when the import is complete. [#10](https://github.com/simonw/datasette-socrata/issues/10)
  - Checks for low disk space using the plugin hook provided by [datasette-low-disk-space-hook](https://github.com/simonw/datasette-low-disk-space-hook). [#4](https://github.com/simonw/datasette-socrata/issues/4)


html_url: https://github.com/simonw/datasette-scale-to-zero/releases/tag/0.1
node_id: RE_kwDOHilbp84EK_lJ
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2022-06-21T22:50:33Z
published_at: 2022-06-21T22:51:59Z
updated_at: 2022-06-21T22:51:59Z
body:
  - Initial release. Can be configured to cause Datasette to exit if it has not received traffic in a specified time period. [#1](https://github.com/simonw/datasette-scale-to-zero/issues/1)


html_url: https://github.com/simonw/datasette-scale-to-zero/releases/tag/0.1.1
node_id: RE_kwDOHilbp84ELAT4
tag_name: 0.1.1
target_commitish: main
name: 0.1.1
created_at: 2022-06-22T00:06:18Z
published_at: 2022-06-22T00:07:40Z
updated_at: 2022-06-22T00:07:40Z
body:
  - Reduced log output when server exits. [#2](https://github.com/simonw/datasette-scale-to-zero/issues/2)


html_url: https://github.com/simonw/datasette-scale-to-zero/releases/tag/0.1.2
node_id: RE_kwDOHilbp84EMCgo
tag_name: 0.1.2
target_commitish: main
name: 0.1.2
created_at: 2022-06-23T00:05:34Z
published_at: 2022-06-23T00:06:21Z
updated_at: 2022-06-23T00:06:21Z
body:
  - No longer logs a traceback on server exit. [#2](https://github.com/simonw/datasette-scale-to-zero/issues/2)


html_url: https://github.com/simonw/s3-ocr/releases/tag/0.1a0
node_id: RE_kwDOHk6Aq84EOJ27
tag_name: 0.1a0
target_commitish: main
name: 0.1a0
created_at: 2022-06-29T02:50:39Z
published_at: 2022-06-29T02:53:10Z
body:
  - `s3-ocr start <bucket>` command for triggering OCR runs using [Textract](https://aws.amazon.com/textract/) for every PDF file in a bucket. [#1](https://github.com/simonw/s3-ocr/issues/1)
  - `s3-ocr status <bucket>` command for checking on the status of the ongoing OCR tasks.


html_url: https://github.com/simonw/s3-ocr/releases/tag/0.2a0
node_id: RE_kwDOHk6Aq84EOd_O
tag_name: 0.2a0
target_commitish: main
name: 0.2a0
created_at: 2022-06-29T19:34:38Z
published_at: 2022-06-29T19:35:21Z
body:
   - New `s3-ocr index database.db name-of-bucket` command for creating a SQLite database containing the OCR results that have been written to the bucket. [#2](https://github.com/simonw/s3-ocr/issues/2)


html_url: https://github.com/simonw/s3-ocr/releases/tag/0.3
node_id: RE_kwDOHk6Aq84EOjkQ
tag_name: 0.3
target_commitish: main
name: 0.3
created_at: 2022-06-30T00:43:10Z
published_at: 2022-06-30T00:44:10Z
body:
  First non-alpha release.

  - Breaking change: the order of arguments for `s3-ocr index <bucket> <database_file>` has been swapped, for consistency with other commands. [#9](https://github.com/simonw/s3-ocr/issues/9)
  - Breaking change: the `start` command no longer defaults to processing every `.pdf` file in the bucket. It now accepts a list of keys, or use the `--all` option to process every PDF file. [#10](https://github.com/simonw/s3-ocr/issues/10)
  - New `s3-ocr fetch <bucket> <path>` command for fetching the raw OCR JSON data for that file. [#7](https://github.com/simonw/s3-ocr/issues/7)
  - New `s3-ocr text <bucket> <path>` command for outputting just the extracted OCR text for a specified file. [#8](https://github.com/simonw/s3-ocr/issues/8)


html_url: https://github.com/simonw/s3-credentials/releases/tag/0.12
node_id: RE_kwDOGUV9is4EO568
tag_name: 0.12
target_commitish: main
name: 0.12
created_at: 2022-06-30T20:00:19Z
published_at: 2022-06-30T20:02:53Z
updated_at: 2022-06-30T20:02:53Z
body:
  - New `--statement JSON` option for both the `s3-credentials create` and `s3-credentials policy` commands, allowing one or more additional policy statements (provided as JSON strings) to be added to the generated IAM policy. [#72](https://github.com/simonw/s3-credentials/issues/72)


html_url: https://github.com/simonw/s3-ocr/releases/tag/0.4
node_id: RE_kwDOHk6Aq84EO7CV
tag_name: 0.4
target_commitish: main
name: 0.4
created_at: 2022-06-30T21:01:50Z
published_at: 2022-06-30T21:03:44Z
body:
  - New command: `s3-ocr inspect-job <job_id>` returns information about the status of a specific job. [#15](https://github.com/simonw/s3-ocr/issues/15)
  - Added a live demo at [s3-ocr-demo.datasette.io](https://s3-ocr-demo.datasette.io/). [#16](https://github.com/simonw/s3-ocr/issues/16)


html_url: https://github.com/simonw/datasette-edit-schema/releases/tag/0.5
node_id: RE_kwDODsD4Ds4EPQl-
tag_name: 0.5
target_commitish: main
name: 0.5
created_at: 2022-07-01T23:12:05Z
published_at: 2022-07-01T23:15:59Z
updated_at: 2022-07-01T23:15:59Z
body:
  - More human-friendly labels for column types. [#29](https://github.com/simonw/datasette-edit-schema/issues/29)
  - `edit-schema` permission check now considers the database name. [#32](https://github.com/simonw/datasette-edit-schema/issues/32)
  - Now depends on `datasette>=0.59` [#30](https://github.com/simonw/datasette-edit-schema/issues/30) and `sqlite-utils>=3.10`. [#33](https://github.com/simonw/datasette-edit-schema/issues/33)


html_url: https://github.com/simonw/datasette-graphql/releases/tag/2.1
node_id: RE_kwDOEPNYIc4EPXJx
tag_name: 2.1
target_commitish: main
name: 2.1
created_at: 2022-07-03T01:17:11Z
published_at: 2022-07-03T01:19:01Z
updated_at: 2022-07-03T01:19:01Z
body:
  - New [graphql_extra_fields() plugin hook](https://datasette.io/plugins/datasette-graphql#user-content-adding-custom-fields-with-plugins) allowing other plugins to add extra fields to the GraphQL schema. [#69](https://github.com/simonw/datasette-graphql/issues/69)


html_url: https://github.com/simonw/datasette-packages/releases/tag/0.2
node_id: RE_kwDOHENadM4EPXVQ
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2022-07-03T02:27:31Z
published_at: 2022-07-03T02:29:02Z
updated_at: 2022-07-03T02:29:02Z
body:
  - Now exposes a `packages` GraphQL field if you also have version 2.1 or higher of the [datasette-graphql plugin](https://datasette.io/plugins/datasette-graphql) installed. [#4](https://github.com/simonw/datasette-packages/issues/4)


html_url: https://github.com/simonw/datasette-upload-csvs/releases/tag/0.7.2
node_id: RE_kwDODf8oPs4EPb9Q
tag_name: 0.7.2
target_commitish: main
name: 0.7.2
created_at: 2022-07-03T20:58:03Z
published_at: 2022-07-03T20:59:48Z
updated_at: 2022-07-03T20:59:48Z
body:
  - Fixed bug where encoding of file was not correctly detected if non-ASCII characters occurred after the first 2KB. The tool now inspects the first 2MB of content (as originally intended) and also upgrades ASCII to `latin-1` since ASCII is a complete subset of `latin-1` and using `latin-1` increases the chance of a successful import. [#25](https://github.com/simonw/datasette-upload-csvs/issues/25)


html_url: https://github.com/simonw/datasette-expose-env/releases/tag/0.1
node_id: RE_kwDOHmgSA84EPcGa
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2022-07-03T21:26:23Z
published_at: 2022-07-03T21:28:55Z
body:
  - Initial release: configure this plugin to expose specific environment variables at `/-/env`. [#1](https://github.com/simonw/datasette-expose-env/issues/1)


html_url: https://github.com/simonw/datasette-redirect-to-https/releases/tag/0.2
node_id: RE_kwDOGaS1TM4EPdFu
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2022-07-04T01:01:25Z
published_at: 2022-07-04T01:02:25Z
body:
  - Optional support for `x-forwarded-proto: http` headers, using a new configuration setting. [#2](https://github.com/simonw/datasette-redirect-to-https/issues/2)


html_url: https://github.com/simonw/sqlite-comprehend/releases/tag/0.1
node_id: RE_kwDOHoFAns4ERIOJ
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2022-07-08T19:58:49Z
published_at: 2022-07-08T20:01:38Z
body:
  - Documentation, in the [README](https://github.com/simonw/sqlite-comprehend/blob/main/README.md). [#3](https://github.com/simonw/sqlite-comprehend/issues/3)
  - New schema design, with a separate `comprehend_entities` table. [#4](https://github.com/simonw/sqlite-comprehend/issues/4)
  - Running the command multiple times will not re-submit rows that have already been processed. [#7](https://github.com/simonw/sqlite-comprehend/issues/7)
  - Errors from the Comprehend API are now logged to standard error. [#8](https://github.com/simonw/sqlite-comprehend/issues/8)


html_url: https://github.com/simonw/sqlite-diffable/releases/tag/0.3
node_id: RE_kwDOC6Gvzs4ERKcf
tag_name: 0.3
target_commitish: main
name: 0.3
created_at: 2022-07-08T23:15:59Z
published_at: 2022-07-08T23:33:16Z
body:
  - New `sqlite-diffable load` command for restoring a previously dumped database. [#3](https://github.com/simonw/sqlite-diffable/issues/3)


html_url: https://github.com/simonw/sqlite-diffable/releases/tag/0.4
node_id: RE_kwDOC6Gvzs4ERmOY
tag_name: 0.4
target_commitish: main
name: 0.4
created_at: 2022-07-11T16:47:58Z
published_at: 2022-07-11T16:48:46Z
body:
  - `sqlite-diffable load ... --replace` option to replace tables that already exist in the destination database file. [#6](https://github.com/simonw/sqlite-diffable/issues/6)


html_url: https://github.com/simonw/sqlite-comprehend/releases/tag/0.2
node_id: RE_kwDOHoFAns4ERqDp
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2022-07-11T19:11:57Z
published_at: 2022-07-11T19:13:02Z
body:
  - `sqlite-comprehend entities --strip-tags` option for stripping HTML tags before sending content to the entity extraction API. [#9](https://github.com/simonw/sqlite-comprehend/issues/9)


html_url: https://github.com/simonw/sqlite-comprehend/releases/tag/0.2.1
node_id: RE_kwDOHoFAns4ERqY9
tag_name: 0.2.1
target_commitish: main
name: 0.2.1
created_at: 2022-07-11T19:32:54Z
published_at: 2022-07-11T19:33:28Z
body:
  - Fixed bug where commands failed to be correctly registered on Linux systems. [#11](https://github.com/simonw/sqlite-comprehend/issues/11)


html_url: https://github.com/simonw/datasette-ics/releases/tag/0.5.2
node_id: RE_kwDODoa7Dc4ERvP9
tag_name: 0.5.2
target_commitish: main
name: 0.5.2
created_at: 2022-07-12T02:07:12Z
published_at: 2022-07-12T02:08:11Z
body:
  - Fix `ImportError` bug by upgrading to `ics` 0.7.2. [#6](https://github.com/simonw/datasette-ics/issues/6)


html_url: https://github.com/simonw/datasette-app/releases/tag/0.2.2
node_id: RE_kwDOF8z3PM4ESGyA
tag_name: 0.2.2
target_commitish: main
name: 0.2.2
created_at: 2022-07-13T01:06:45Z
published_at: 2022-07-13T01:08:17Z
updated_at: 2022-07-13T01:22:31Z
body:
  -   Fixed bug where application could crash on launch. Thanks, [Michael C](https://github.com/simonw/datasette-app-support/pull/20). [#139](https://github.com/simonw/datasette-app/issues/139)
  -   Upgraded to Electron 19 and latest Datasette


html_url: https://github.com/simonw/datasette-publish-vercel/releases/tag/0.14
node_id: RE_kwDODx4htM4ESV8s
tag_name: 0.14
target_commitish: main
name: 0.14
created_at: 2022-07-13T15:45:18Z
published_at: 2022-07-13T15:48:22Z
body:
  - Fixed bug caused by removal of `--no-clipboard` option in [Vercel 27.0.0](https://github.com/vercel/vercel/releases/tag/vercel%4027.0.0). [#57](https://github.com/simonw/datasette-publish-vercel/issues/57)
  - Errors that occur when running the `vercel` command are now reflected in the exit status of `datasette publish vercel`.


html_url: https://github.com/simonw/sqlite-utils/releases/tag/3.28
node_id: RE_kwDOCGYnMM4ETJ-y
tag_name: 3.28
target_commitish: main
name: 3.28
created_at: 2022-07-15T22:56:01Z
published_at: 2022-07-15T23:02:45Z
updated_at: 2022-07-20T23:09:26Z
body:
  -   New [table.duplicate(new_name)](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-duplicate) method for creating a copy of a table with a matching schema and row contents. Thanks, [David](https://github.com/davidleejy). ([#449](https://github.com/simonw/sqlite-utils/issues/449))
  -   New `sqlite-utils duplicate data.db table_name new_name` CLI command for [Duplicating tables](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-duplicate-table). ([#454](https://github.com/simonw/sqlite-utils/issues/454))
  -   `sqlite_utils.utils.rows_from_file()` is now a [documented API](https://sqlite-utils.datasette.io/en/stable/reference.html#reference-utils-rows-from-file). It can be used to read a sequence of dictionaries from a file-like object containing CSV, TSV, JSON or newline-delimited JSON. It can be passed an explicit format or can attempt to detect the format automatically. ([#443](https://github.com/simonw/sqlite-utils/issues/443))
  -   `sqlite_utils.utils.TypeTracker` is now a documented API for detecting the likely column types for a sequence of string rows, see [Detecting column types using TypeTracker](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-typetracker). ([#445](https://github.com/simonw/sqlite-utils/issues/445))
  -   `sqlite_utils.utils.chunks()` is now a documented API for [splitting an iterator into chunks](https://sqlite-utils.datasette.io/en/stable/reference.html#reference-utils-chunks). ([#451](https://github.com/simonw/sqlite-utils/issues/451))
  -   `sqlite-utils enable-fts` now has a `--replace` option for replacing the existing FTS configuration for a table. ([#450](https://github.com/simonw/sqlite-utils/issues/450))
  -   The `create-index`, `add-column` and `duplicate` commands all now take a `--ignore` option for ignoring errors should the database not be in the right state for them to operate. ([#450](https://github.com/simonw/sqlite-utils/issues/450))


html_url: https://github.com/simonw/datasette/releases/tag/0.62a1
node_id: RE_kwDOBm6k_c4ETXH1
tag_name: 0.62a1
target_commitish: main
name: 0.62a1
created_at: 2022-07-18T01:06:37Z
published_at: 2022-07-18T01:09:05Z
updated_at: 2022-07-18T01:09:05Z
body:
  - New plugin hook: [handle_exception()](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-handle-exception), for custom handling of exceptions caught by Datasette. ([#1770](https://github.com/simonw/datasette/issues/1770))
  - The [render_cell()](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-render-cell) plugin hook is now also passed a `row` argument, representing the `sqlite3.Row` object that is being rendered. ([#1300](https://github.com/simonw/datasette/issues/1300))
  - New `--nolock` option for ignoring file locks when opening read-only databases. ([#1744](https://github.com/simonw/datasette/issues/1744))
  - Documentation now uses the [Furo](https://github.com/pradyunsg/furo) Sphinx theme. ([#1746](https://github.com/simonw/datasette/issues/1746))
  - Datasette now has a [Discord community](https://discord.gg/ktd74dm5mw).
  - Database file downloads now implement conditional GET using ETags. ([#1739](https://github.com/simonw/datasette/issues/1739))
  - Examples in the documentation now include a copy-to-clipboard button. ([#1748](https://github.com/simonw/datasette/issues/1748))
  - HTML for facet results and suggested results has been extracted out into new templates `_facet_results.html` and `_suggested_facets.html`. Thanks, M. Nasimul Haque. ([#1759](https://github.com/simonw/datasette/pull/1759))


html_url: https://github.com/simonw/datasette-sentry/releases/tag/0.2a0
node_id: RE_kwDODh5N084ETrWB
tag_name: 0.2a0
target_commitish: main
name: 0.2a0
created_at: 2022-07-18T20:29:03Z
published_at: 2022-07-18T20:30:04Z
body:
  - Use new `handle_exception()` hook added in Datasette 0.61a1. [#1](https://github.com/simonw/datasette-sentry/issues/1)


html_url: https://github.com/simonw/datasette-graphql/releases/tag/2.1.1
node_id: RE_kwDOEPNYIc4ETsA3
tag_name: 2.1.1
target_commitish: main
name: 2.1.1
created_at: 2022-07-18T21:11:20Z
published_at: 2022-07-18T21:13:34Z
updated_at: 2022-07-18T21:13:34Z
body:
  - Simplified example code in the documentation for the `graphql_extra_fields()` hook.
  - Workaround for a bug where some tables could cause a 500 error on the regular table view page. [#90](https://github.com/simonw/datasette-graphql/issues/90)


html_url: https://github.com/simonw/s3-ocr/releases/tag/0.5
node_id: RE_kwDOHk6Aq84ETvH0
tag_name: 0.5
target_commitish: main
name: 0.5
created_at: 2022-07-19T02:31:21Z
published_at: 2022-07-19T02:35:36Z
body:
  - Ability to run OCR against just the PDF files contained within a specific folder in the S3 bucket, using `s3-ocr start my-bucket --prefix my-prefix/`. [#20](https://github.com/simonw/s3-ocr/issues/20)
  - New command: `s3-ocr dedupe my-bucket` - scans the bucket for any new files that are duplicates of files that have already been OCRd and writes out job results to reuse existing OCR results and avoid processing them a second time in the future. [#19](https://github.com/simonw/s3-ocr/issues/19)


html_url: https://github.com/simonw/datasette-insert/releases/tag/0.8
node_id: RE_kwDOELgXO84EVF5o
tag_name: 0.8
target_commitish: main
name: 0.8
created_at: 2022-07-22T17:50:41Z
published_at: 2022-07-22T17:52:23Z
body:
  - Now serves CORS headers if Datasette is started with the `--cors` option. [#17](https://github.com/simonw/datasette-insert/issues/17)


html_url: https://github.com/simonw/datasette-publish-vercel/releases/tag/0.14.1
node_id: RE_kwDODx4htM4EVMCO
tag_name: 0.14.1
target_commitish: main
name: 0.14.1
created_at: 2022-07-23T02:57:11Z
published_at: 2022-07-23T02:58:36Z
body:
  - Fix for 500 error when run with latest `@vercel/python` [#58](https://github.com/simonw/datasette-publish-vercel/issues/58)


html_url: https://github.com/simonw/datasette-sqlite-fts4/releases/tag/0.3.1
node_id: RE_kwDOCcM_5s4EWzKC
tag_name: 0.3.1
target_commitish: master
name: 0.3.1
created_at: 2022-07-28T16:41:34Z
published_at: 2022-07-28T16:47:54Z
body:
  - Now depends on [sqlite-fts4 1.0.2](https://github.com/simonw/sqlite-fts4/releases/tag/1.0.2) for compatibility with big-endian systems.


html_url: https://github.com/simonw/shot-scraper/releases/tag/0.14.2
node_id: RE_kwDOG-A5W84EW1QM
tag_name: 0.14.2
target_commitish: main
name: 0.14.2
created_at: 2022-07-28T18:31:24Z
published_at: 2022-07-28T18:32:10Z
updated_at: 2022-07-28T18:32:10Z
body:
  - Documentation improvements. [0.14.1...0.14.2](https://github.com/simonw/shot-scraper/compare/0.14.1...0.14.2)


html_url: https://github.com/simonw/s3-credentials/releases/tag/0.12.1
node_id: RE_kwDOGUV9is4EX5xN
tag_name: 0.12.1
target_commitish: main
name: 0.12.1
created_at: 2022-08-01T19:45:53Z
published_at: 2022-08-01T19:50:53Z
updated_at: 2022-08-01T19:50:53Z
body:
  - Using the `--policy` or `--statement` options now implies `--user-permissions-boundary=none`. Previously it was easy to use these options to accidentally create credentials that did not work as expected since they would have a default permissions boundary that locked them down to only being able to access S3. [#74](https://github.com/simonw/s3-credentials/issues/74)
  - The `s3-credentials.AmazonS3FullAccess` role created by this tool in order to issue temporary credentials previously used the default `MaxSessionDuration` value of 3600, preventing it from creating credentials that could last more than an hour. This has been increased to 12 hours. See [this issue comment](https://github.com/simonw/s3-credentials/issues/75#issuecomment-1201643771) for instructions on fixing your existing role if this bug is affecting your account. [#75](https://github.com/simonw/s3-credentials/issues/75)


html_url: https://github.com/simonw/shot-scraper/releases/tag/0.14.3
node_id: RE_kwDOG-A5W84EYVrr
tag_name: 0.14.3
target_commitish: main
name: 0.14.3
created_at: 2022-08-02T23:40:20Z
published_at: 2022-08-02T23:41:37Z
updated_at: 2022-08-02T23:41:37Z
body:
  - Improved example workflow in [Optimizing PNGs using Oxipng](https://shot-scraper.datasette.io/en/stable/github-actions.html#optimizing-pngs-using-oxipng).
  - Fixed typos in README and documentation. [#83](https://github.com/simonw/shot-scraper/pull/83)


html_url: https://github.com/simonw/datasette-scale-to-zero/releases/tag/0.2
node_id: RE_kwDOHilbp84EZf3-
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2022-08-05T22:28:12Z
published_at: 2022-08-05T22:29:17Z
updated_at: 2022-08-05T22:29:17Z
body:
  - New `"max-age": "10h"` configuration setting, which causes the server to exit after the specified amount of time whether or not it has received any traffic. [#3](https://github.com/simonw/datasette-scale-to-zero/issues/3)


html_url: https://github.com/simonw/s3-ocr/releases/tag/0.6
node_id: RE_kwDOHk6Aq84EZq2d
tag_name: 0.6
target_commitish: main
name: 0.6
created_at: 2022-08-07T17:38:41Z
published_at: 2022-08-07T17:42:07Z
body:
  - `s3-ocr start` now automatically pauses and then retries if Textract complains that there are too many jobs running. This can be turned into an early exit with an error message using the new `--no-retry` option. [#21](https://github.com/simonw/s3-ocr/issues/21)
  - New `s3-ocr start --dry-run` option for displaying what would happen without starting the OCR process. [#22](https://github.com/simonw/s3-ocr/issues/22)
  - Textract now runs in the same region as the S3 bucket it is writing to, avoiding an error. [#24](https://github.com/simonw/s3-ocr/issues/24)


html_url: https://github.com/hydrosquall/datasette-nteract-data-explorer/releases/tag/0.4.1
node_id: RE_kwDOHEflbM4EaAHe
tag_name: 0.4.1
target_commitish: main
name: 0.4.1 - Enable permalinks to graphs
created_at: 2022-08-08T19:59:34Z
published_at: 2022-08-08T20:02:05Z
body:
  ## What's Changed
  * feat: add demo site landing page by @hydrosquall in https://github.com/hydrosquall/datasette-nteract-data-explorer/pull/14
  * feature: synchronize graph state to URL parameters, enabling permalinking + sharing graphs by @hydrosquall in https://github.com/hydrosquall/datasette-nteract-data-explorer/pull/19
  * Added PR templates + Issue contributing guide

  **Full Changelog**: https://github.com/hydrosquall/datasette-nteract-data-explorer/compare/0.3.1...0.4.1


html_url: https://github.com/simonw/s3-ocr/releases/tag/0.6.1
node_id: RE_kwDOHk6Aq84EaaWy
tag_name: 0.6.1
target_commitish: main
name: 0.6.1
created_at: 2022-08-09T19:39:05Z
published_at: 2022-08-09T19:40:19Z
body:
  - Now pins to `click>=8.0`, which should avoid a bug where installing this on a machine with an older version of Click present would lead to the commands failing to register. [#25](https://github.com/simonw/s3-ocr/issues/25)
  - `s3-ocr --help` now includes links to the documentation and changelog.


html_url: https://github.com/simonw/s3-ocr/releases/tag/0.6.2
node_id: RE_kwDOHk6Aq84Eabg7
tag_name: 0.6.2
target_commitish: main
name: 0.6.2
created_at: 2022-08-09T20:34:49Z
published_at: 2022-08-09T20:35:32Z
body:
  - Fixed bug where commands were sometimes not properly registered. [#26](https://github.com/simonw/s3-ocr/issues/26)


html_url: https://github.com/simonw/s3-ocr/releases/tag/0.6.3
node_id: RE_kwDOHk6Aq84EahSc
tag_name: 0.6.3
target_commitish: main
name: 0.6.3
created_at: 2022-08-10T04:42:11Z
published_at: 2022-08-10T04:43:17Z
body:
  - Pages with no OCR text on them are now recorded as rows with empty strings, instead of being skipped entirely. [#23](https://github.com/simonw/s3-ocr/issues/23)


html_url: https://github.com/simonw/s3-credentials/releases/tag/0.13
node_id: RE_kwDOGUV9is4EbhH5
tag_name: 0.13
target_commitish: main
name: 0.13
created_at: 2022-08-12T18:16:30Z
published_at: 2022-08-12T18:21:02Z
updated_at: 2022-08-12T18:21:02Z
body:
  - Documentation now lives on a dedicated documentation website: https://s3-credentials.readthedocs.io/ [#71](https://github.com/simonw/s3-credentials/issues/71)
  - `s3-credentials create ... --website --create-bucket` now creates an S3 bucket that is configured to act as a website, with `index.html` an the index page and `error.html` as the page used for any errors. [#21](https://github.com/simonw/s3-credentials/issues/21)
  - `s3-credentials list-buckets --details` now returns the bucket region and the URL to the website, if it is configured to act as a website. [#77](https://github.com/simonw/s3-credentials/issues/77)
  - Fixed a bug where `list-bucket` would return an error if the bucket (or specified `--prefix`) was empty. [#76](https://github.com/simonw/s3-credentials/issues/76)


html_url: https://github.com/simonw/datasette/releases/tag/0.62
node_id: RE_kwDOBm6k_c4EbwbF
tag_name: 0.62
target_commitish: main
name: 0.62
created_at: 2022-08-14T17:32:42Z
published_at: 2022-08-14T17:43:05Z
updated_at: 2022-08-14T17:43:05Z
body:
  Datasette can now run entirely in your browser using WebAssembly. Try out [Datasette Lite](https://lite.datasette.io/), take a look [at the code](https://github.com/simonw/datasette-lite) or read more about it in [Datasette Lite: a server-side Python web application running in a browser](https://simonwillison.net/2022/May/4/datasette-lite/).

  Datasette now has a [Discord community](https://discord.gg/ktd74dm5mw) for questions and discussions about Datasette and its ecosystem of projects.

  ## Features

  -   Datasette is now compatible with [Pyodide](https://pyodide.org/). This is the enabling technology behind [Datasette Lite](https://lite.datasette.io/). ([#1733](https://github.com/simonw/datasette/issues/1733))
  -   Database file downloads now implement conditional GET using ETags. ([#1739](https://github.com/simonw/datasette/issues/1739))
  -   HTML for facet results and suggested results has been extracted out into new templates `_facet_results.html` and `_suggested_facets.html`. Thanks, M. Nasimul Haque. ([#1759](https://github.com/simonw/datasette/pull/1759))
  -   Datasette now runs some SQL queries in parallel. This has limited impact on performance, see [this research issue](https://github.com/simonw/datasette/issues/1727) for details.
  -   New `--nolock` option for ignoring file locks when opening read-only databases. ([#1744](https://github.com/simonw/datasette/issues/1744))
  -   Spaces in the database names in URLs are now encoded as `+` rather than `~20`. ([#1701](https://github.com/simonw/datasette/issues/1701))
  -   `<Binary: 2427344 bytes>` is now displayed as `<Binary: 2,427,344 bytes>` and is accompanied by tooltip showing "2.3MB". ([#1712](https://github.com/simonw/datasette/issues/1712))
  -   The base Docker image used by `datasette publish cloudrun`, `datasette package` and the [official Datasette image](https://hub.docker.com/datasetteproject/datasette) has been upgraded to `3.10.6-slim-bullseye`. ([#1768](https://github.com/simonw/datasette/issues/1768))
  -   Canned writable queries against immutable databases now show a warning message. ([#1728](https://github.com/simonw/datasette/issues/1728))
  -   `datasette publish cloudrun` has a new `--timeout` option which can be used to increase the time limit applied by the Google Cloud build environment. Thanks, Tim Sherratt. ([#1717](https://github.com/simonw/datasette/pull/1717))
  -   `datasette publish cloudrun` has new `--min-instances` and `--max-instances` options. ([#1779](https://github.com/simonw/datasette/issues/1779))

  ## Plugin hooks

  -   New plugin hook: [handle_exception()](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-handle-exception), for custom handling of exceptions caught by Datasette. ([#1770](https://github.com/simonw/datasette/issues/1770))
  -   The [render_cell()](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-render-cell) plugin hook is now also passed a `row` argument, representing the `sqlite3.Row` object that is being rendered. ([#1300](https://github.com/simonw/datasette/issues/1300))
  -   The [configuration directory](https://docs.datasette.io/en/stable/settings.html#config-dir) is now stored in `datasette.config_dir`, making it available to plugins. Thanks, Chris Amico. ([#1766](https://github.com/simonw/datasette/pull/1766))

  ## Bug fixes

  -   Don't show the facet option in the cog menu if faceting is not allowed. ([#1683](https://github.com/simonw/datasette/issues/1683))
  -   `?_sort` and `?_sort_desc` now work if the column that is being sorted has been excluded from the query using `?_col=` or `?_nocol=`. ([#1773](https://github.com/simonw/datasette/issues/1773))
  -   Fixed bug where `?_sort_desc` was duplicated in the URL every time the Apply button was clicked. ([#1738](https://github.com/simonw/datasette/issues/1738))

  ## Documentation

  -   Examples in the documentation now include a copy-to-clipboard button. ([#1748](https://github.com/simonw/datasette/issues/1748))
  -   Documentation now uses the [Furo](https://github.com/pradyunsg/furo) Sphinx theme. ([#1746](https://github.com/simonw/datasette/issues/1746))
  -   Code examples in the documentation are now all formatted using Black. ([#1718](https://github.com/simonw/datasette/issues/1718))
  -   `Request.fake()` method is now documented, see [Request object](https://docs.datasette.io/en/stable/internals.html#internals-request).
  -   New documentation for plugin authors: [Registering a plugin for the duration of a test](https://docs.datasette.io/en/stable/testing_plugins.html#testing-plugins-register-in-test). ([#903](https://github.com/simonw/datasette/issues/903))

reactions:
  {"url": "https://api.github.com/repos/simonw/datasette/releases/74385093/reactions", "total_count": 2, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 2, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/datasette-sentry/releases/tag/0.2
node_id: RE_kwDODh5N084Ebx0-
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2022-08-14T22:58:44Z
published_at: 2022-08-14T23:00:36Z
body:
  - Now uses the new [handle_exception()](https://docs.datasette.io/en/stable/plugin_hooks.html#handle-exception-datasette-request-exception) plugin hook introduced in [Datasette 0.62](https://docs.datasette.io/en/stable/changelog.html#v0-62). [#3](https://github.com/simonw/datasette-sentry/issues/3)


html_url: https://github.com/simonw/sqlite-diffable/releases/tag/0.5
node_id: RE_kwDOC6Gvzs4EdRqX
tag_name: 0.5
target_commitish: main
name: 0.5
created_at: 2022-08-18T22:47:58Z
published_at: 2022-08-18T22:49:30Z
body:
  - `sqlite-diffable objects path-to/table.ndjson` command for converting a newline-delimited file of JSON arrays into a sequence of JSON objects. [#7](https://github.com/simonw/sqlite-diffable/issues/7)


html_url: https://github.com/simonw/datasette-mp3-audio/releases/tag/0.1
node_id: RE_kwDOH2kMZM4EdwwE
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2022-08-20T16:38:46Z
published_at: 2022-08-20T16:45:42Z
body:
  - Initial release. Adds `<audio>` players to any table cell containing the URL to a `.mp3` file. [#1](https://github.com/simonw/datasette-mp3-audio/issues/1)


html_url: https://github.com/simonw/datasette-mp3-audio/releases/tag/0.2
node_id: RE_kwDOH2kMZM4EdyNt
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2022-08-20T23:14:51Z
published_at: 2022-08-20T23:14:56Z
body:
  - Added a "Play all MP3s" button to any table page listing more than one MP3. [#2](https://github.com/simonw/datasette-mp3-audio/issues/2)


html_url: https://github.com/dogsheep/pocket-to-sqlite/releases/tag/0.2.2
node_id: RE_kwDODLZ_YM4EeJML
tag_name: 0.2.2
target_commitish: main
name: 0.2.2
created_at: 2022-08-22T16:18:16Z
published_at: 2022-08-22T16:21:34Z
body:
  - `-a` is now the shortcut for `--auth` - previously it was duplicated as a shortcut for `--all`. Thanks, [Thomas Lockney](https://github.com/tlockney).  [#7](https://github.com/dogsheep/pocket-to-sqlite/issues/7)
  - `pocket-to-sqlite auth` command now updates the existing `auth.json` file rather than over-writing it. [#10](https://github.com/dogsheep/pocket-to-sqlite/issues/10)


html_url: https://github.com/simonw/datasette-edit-schema/releases/tag/0.5.1
node_id: RE_kwDODsD4Ds4EeP4S
tag_name: 0.5.1
target_commitish: main
name: 0.5.1
created_at: 2022-08-22T22:45:03Z
published_at: 2022-08-22T22:45:58Z
updated_at: 2022-08-22T22:45:58Z
body:
  - Fixed error trying to add new floating point columns to a table. [#34](https://github.com/simonw/datasette-edit-schema/issues/34)


html_url: https://github.com/simonw/datasette-publish-vercel/releases/tag/0.14.2
node_id: RE_kwDODx4htM4EfFfQ
tag_name: 0.14.2
target_commitish: main
name: 0.14.2
created_at: 2022-08-24T17:42:15Z
published_at: 2022-08-24T17:43:41Z
body:
  - Fixed bug where using boolean settings such as `--setting allow_downloads 0` would cause deployments to serve 500 errors.  [#61](https://github.com/simonw/datasette-publish-vercel/issues/61)


html_url: https://github.com/hydrosquall/datasette-nteract-data-explorer/releases/tag/0.4.2
node_id: RE_kwDOHEflbM4EgMBS
tag_name: 0.4.2
target_commitish: main
name: 0.4.2 - Datasette-Lite hook
created_at: 2022-08-27T16:17:37Z
published_at: 2022-08-27T16:31:11Z
body:
  ## What's Changed
  * fix(demo): build updated demo JS statics as part of build pipeline by @hydrosquall in https://github.com/hydrosquall/datasette-nteract-data-explorer/pull/24
  * feat: proof of concept initialization hook for instantiating JS plugins in datasette-lite by @hydrosquall in https://github.com/hydrosquall/datasette-nteract-data-explorer/pull/26
  * bump: version 0.4.2 by @hydrosquall in https://github.com/hydrosquall/datasette-nteract-data-explorer/pull/27


  **Full Changelog**: https://github.com/hydrosquall/datasette-nteract-data-explorer/compare/0.4.1...0.4.2


html_url: https://github.com/simonw/sqlite-utils/releases/tag/3.29
node_id: RE_kwDOCGYnMM4EgPTo
tag_name: 3.29
target_commitish: main
name: 3.29
created_at: 2022-08-28T03:48:36Z
published_at: 2022-08-28T03:50:29Z
updated_at: 2022-08-28T03:50:29Z
body:
  - The `sqlite-utils query`, `memory` and `bulk` commands now all accept a new `--functions` option. This can be passed a string of Python code, and any callable objects defined in that code will be made available to SQL queries as custom SQL functions. See [Defining custom SQL functions](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-query-functions) for details. ([#471](https://github.com/simonw/sqlite-utils/issues/471))
  - `db[table].create(...)` method now accepts a new `transform=True` parameter. If the table already exists it will be transform to match the schema configuration options passed to the function. This may result in columns being added or dropped, column types being changed, column order being updated or not null and default values for columns being set. ([#467](https://github.com/simonw/sqlite-utils/issues/467))
  - Related to the above, the `sqlite-utils create-table` command now accepts a `--transform` option.
  - New introspection property: `table.default_values` returns a dictionary mapping each column name with a default value to the configured default value. ([#475](https://github.com/simonw/sqlite-utils/issues/475))
  - The `--load-extension` option can now be provided a path to a compiled SQLite extension module accompanied by the name of an entrypoint, separated by a colon - for example `--load-extension ./lines0:sqlite3_lines0_noread_init`. This feature is modelled on code first [contributed to Datasette](https://github.com/simonw/datasette/pull/1789) by Alex Garcia. ([#470](https://github.com/simonw/sqlite-utils/issues/470))
  - Functions registered using the [db.register_function()](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-register-function) method can now have a custom name specified using the new `db.register_function(fn, name=...)` parameter. ([#458](https://github.com/simonw/sqlite-utils/issues/458))
  - [sqlite-utils rows](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-rows) has a new `--order` option for specifying the sort order for the returned rows. ([#469](https://github.com/simonw/sqlite-utils/issues/469))
  - All of the CLI options that accept Python code blocks can now all be used to define functions that can access modules imported in that same block of code without needing to use the `global` keyword. ([#472](https://github.com/simonw/sqlite-utils/issues/472))
  - Fixed bug where `table.extract()` would not behave correctly for columns containing null values. Thanks, Forest Gregg. ([#423](https://github.com/simonw/sqlite-utils/issues/423))
  - New tutorial: [Cleaning data with sqlite-utils and Datasette](https://datasette.io/tutorials/clean-data) shows how to use `sqlite-utils` to import and clean an example CSV file.
  - Datasette and `sqlite-utils` now have a Discord community. [Join the Discord here](https://discord.gg/Ass7bCAMDw).

reactions:
  {"url": "https://api.github.com/repos/simonw/sqlite-utils/releases/75560168/reactions", "total_count": 1, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 1, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/datasette-sitemap/releases/tag/0.1
node_id: RE_kwDOH50_7s4Egw44
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2022-08-29T22:18:35Z
published_at: 2022-08-29T22:19:49Z
body:
  - Initial release: configure a SQL query to return a `/sitemap.xml` for your site. [#1](https://github.com/simonw/datasette-sitemap/issues/1)


html_url: https://github.com/simonw/datasette-block-robots/releases/tag/1.1
node_id: RE_kwDOEFljXc4EhJ2H
tag_name: 1.1
target_commitish: main
name: 1.1
created_at: 2022-08-30T16:23:32Z
published_at: 2022-08-30T16:25:38Z
body:
  - Now registers a new [block_robots_extra_lines() plugin hook](https://github.com/simonw/datasette-block-robots/blob/1.1/README.md#extending-this-with-other-plugins) which other plugins can use to contribute to `/robots.txt`. [#6](https://github.com/simonw/datasette-block-robots/issues/6)


html_url: https://github.com/simonw/datasette-sitemap/releases/tag/1.0
node_id: RE_kwDOH50_7s4EhME_
tag_name: 1.0
target_commitish: main
name: 1.0
created_at: 2022-08-30T17:56:48Z
published_at: 2022-08-30T17:59:53Z
body:
  - This plugin now interacts correctly with the [datasette-block-robots](https://datasette.io/plugins/datasette-block-robots) plugin, adding the `Sitemap:` reference to the existing `robots.txt` file if that other plugin is installed. [#4](https://github.com/simonw/datasette-sitemap/issues/4)
  - Now registers a new [sitemap_extra_paths() plugin hook](https://github.com/simonw/datasette-sitemap/blob/1.0/README.md#adding-paths-to-the-sitemap-from-other-plugins) which other plugins can use to contribute to `/sitemap.xml`. [#5](https://github.com/simonw/datasette-sitemap/issues/5)


html_url: https://github.com/simonw/datasette-render-image-tags/releases/tag/0.1
node_id: RE_kwDOH7vZQ84Eivrv
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2022-09-04T00:47:07Z
published_at: 2022-09-04T00:48:32Z
body:
  - Initial release. Cells containing a URL that end in an image extension will be converted into image tags with a width of 200 pixels.


html_url: https://github.com/simonw/datasette-upload-csvs/releases/tag/0.8
node_id: RE_kwDODf8oPs4EkSIA
tag_name: 0.8
target_commitish: main
name: 0.8
created_at: 2022-09-08T17:04:08Z
published_at: 2022-09-08T17:07:41Z
updated_at: 2022-09-08T17:07:41Z
body:
  - The user now gets to confirm the name of the table to be created before uploading the file. [#17](https://github.com/simonw/datasette-upload-csvs/issues/17)
  - Column types are automatically detected based on the uploaded data. Previously all columns were TEXT columns. [#26](https://github.com/simonw/datasette-upload-csvs/issues/26)
  - If a table with the desired name already exists, a suffix of `_2` or higher is appended. [#29](https://github.com/simonw/datasette-upload-csvs/issues/29)
  - Fixed a bug where usage alongside a custom `base.html` template with `extra_head` content would be ignored. [#27](https://github.com/simonw/datasette-upload-csvs/issues/27)


html_url: https://github.com/simonw/datasette-upload-csvs/releases/tag/0.8.1
node_id: RE_kwDODf8oPs4EkWYG
tag_name: 0.8.1
target_commitish: main
name: 0.8.1
created_at: 2022-09-08T19:50:41Z
published_at: 2022-09-08T19:51:53Z
updated_at: 2022-09-08T19:51:53Z
body:
  - Fixed compatibility bug where running this plugin at the same time as [datasette-upload-dbs](https://datasette.io/plugins/datasette-upload-dbs) could trigger errors. [#30](https://github.com/simonw/datasette-upload-csvs/issues/30)


html_url: https://github.com/simonw/datasette-upload-dbs/releases/tag/0.1.2
node_id: RE_kwDOHSfuMs4EktwB
tag_name: 0.1.2
target_commitish: main
name: 0.1.2
created_at: 2022-09-09T15:57:58Z
published_at: 2022-09-09T15:58:38Z
updated_at: 2022-09-09T15:58:38Z
body:
  - Uploaded databases are now treated as mutable - previously they were incorrectly configured to be immutable. [#6](https://github.com/simonw/datasette-upload-dbs/issues/6)


html_url: https://github.com/simonw/shot-scraper/releases/tag/0.15
node_id: RE_kwDOG-A5W84Elfy_
tag_name: 0.15
target_commitish: main
name: 0.15
created_at: 2022-09-12T20:56:20Z
published_at: 2022-09-12T20:57:07Z
updated_at: 2022-09-12T21:09:48Z
body:
  - New [--log-requests option](https://shot-scraper.datasette.io/en/stable/screenshots.html#logging-all-requests) for logging out newline-delimited JSON showing all requests made while rendering a page, including image and asset loads. [#88](https://github.com/simonw/shot-scraper/issues/88)
  - New [shot-scraper pdf](https://shot-scraper.datasette.io/en/stable/pdf.html) formatting options: `--format`, `--width`, `--height`, `--scale` and `--print-background`. Thanks, Eddie Chapman. [#87](https://github.com/simonw/shot-scraper/pull/87)
  - Removed `-h` shortcut for help - use `--help` instead. `-h` was clashing with the shorter version of `--height`. Thanks, Matthew Bafford. [#84](https://github.com/simonw/shot-scraper/pull/84)


html_url: https://github.com/simonw/shot-scraper/releases/tag/0.15.1
node_id: RE_kwDOG-A5W84El2ZJ
tag_name: 0.15.1
target_commitish: main
name: 0.15.1
created_at: 2022-09-13T17:14:41Z
published_at: 2022-09-13T17:15:53Z
updated_at: 2022-09-13T17:15:53Z
body:
  - Fix error message shown when `--log-requests` tries to log a request with an unknown response size. [#89](https://github.com/simonw/shot-scraper/issues/89)


html_url: https://github.com/simonw/shot-scraper/releases/tag/0.16
node_id: RE_kwDOG-A5W84Emm6W
tag_name: 0.16
target_commitish: main
name: 0.16
created_at: 2022-09-15T03:16:51Z
published_at: 2022-09-15T03:18:44Z
updated_at: 2022-09-15T03:18:44Z
body:
  - Fixed error message displayed when attempting to use `--log-requests` on a page that includes a redirect. [#90](https://github.com/simonw/shot-scraper/issues/90)
  - `--log-requests` output now includes a `"status": 200` field indicating the HTTP status code returned by that response.


html_url: https://github.com/simonw/s3-credentials/releases/tag/0.14
node_id: RE_kwDOGUV9is4EnDXL
tag_name: 0.14
target_commitish: main
name: 0.14
created_at: 2022-09-15T23:40:59Z
published_at: 2022-09-15T23:43:10Z
updated_at: 2022-09-15T23:43:10Z
body:
  - `s3-credentials put-objects` command ([docs](https://s3-credentials.readthedocs.io/en/stable/other-commands.html#put-objects)) for uploading more than one file or directory to an S3 bucket at a time. [#68](https://github.com/simonw/s3-credentials/issues/68)
  - `s3-credentials get-objects` command ([docs](https://s3-credentials.readthedocs.io/en/stable/other-commands.html#get-objects)) for downloading multiple files from an S3 bucket. [#78](https://github.com/simonw/s3-credentials/issues/78)


html_url: https://github.com/simonw/datasette-sandstorm-support/releases/tag/0.2
node_id: RE_kwDOH99rF84EnUm-
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2022-09-16T17:12:49Z
published_at: 2022-09-16T17:14:12Z
body:
  - Additional permissions. Thanks, [@ocdtrekkie](https://github.com/ocdtrekkie). [#3](https://github.com/simonw/datasette-sandstorm-support/pull/3)


html_url: https://github.com/simonw/datasette/releases/tag/0.63a0
node_id: RE_kwDOBm6k_c4EqTKK
tag_name: 0.63a0
target_commitish: main
name: 0.63a0
created_at: 2022-09-26T21:14:25Z
published_at: 2022-09-26T21:56:30Z
updated_at: 2022-09-26T21:56:30Z
body:
  - The [prepare_jinja2_environment(env, datasette)](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-prepare-jinja2-environment) plugin hook now accepts an optional `datasette` argument. Hook implementations can also now return an `async` function which will be awaited automatically. ([#1809](https://github.com/simonw/datasette/issues/1809))
  - `--load-extension` option now supports entrypoints. Thanks, Alex Garcia. ([#1789](https://github.com/simonw/datasette/pull/1789))
  - New tutorial: [Cleaning data with sqlite-utils and Datasette](https://datasette.io/tutorials/clean-data).
  - Facet size can now be set per-table with the new `facet_size` table metadata option. ([#1804](https://github.com/simonw/datasette/issues/1804))
  - `truncate_cells_html` setting now also affects long URLs in columns. ([#1805](https://github.com/simonw/datasette/issues/1805))
  - `Database(is_mutable=)` now defaults to `True`. ([#1808](https://github.com/simonw/datasette/issues/1808))
  - Non-JavaScript textarea now increases height to fit the SQL query. ([#1786](https://github.com/simonw/datasette/issues/1786))
  - More detailed command descriptions on the [CLI reference](https://docs.datasette.io/en/latest/cli-reference.html#cli-reference) page. ([#1787](https://github.com/simonw/datasette/issues/1787))
  - Datasette no longer enforces upper bounds on its depenedencies. ([#1800](https://github.com/simonw/datasette/issues/1800))
  - Facets are now displayed with better line-breaks in long values. Thanks, Daniel Rech. ([#1794](https://github.com/simonw/datasette/pull/1794))
  - The `settings.json` file used in [Configuration directory mode](https://docs.datasette.io/en/latest/settings.html#config-dir) is now validated on startup. ([#1816](https://github.com/simonw/datasette/issues/1816))


html_url: https://github.com/simonw/datasette-pretty-json/releases/tag/0.2.2
node_id: RE_kwDOCf9bl84Erd7d
tag_name: 0.2.2
target_commitish: master
name: 0.2.2
created_at: 2022-09-28T21:05:21Z
published_at: 2022-09-28T21:06:31Z
body:
  - Fix for compatibility with latest Jinja. [#2](https://github.com/simonw/datasette-pretty-json/issues/2)


html_url: https://github.com/simonw/datasette-publish-fly/releases/tag/1.2
node_id: RE_kwDODs4PE84Er5IS
tag_name: 1.2
target_commitish: main
name: 1.2
created_at: 2022-09-29T17:23:42Z
published_at: 2022-09-29T17:25:15Z
body:
  - New `-o/--org` option for specifying the Fly organization to deploy to - defaults to "personal". [#22](https://github.com/simonw/datasette-publish-fly/issues/22)
  - Fixed bug where port no needs to be specified as an integer. [#21](https://github.com/simonw/datasette-publish-fly/issues/21)


html_url: https://github.com/datasette/datasette-public/releases/tag/0.1
node_id: RE_kwDOIIe2Hs4EtZLc
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2022-10-05T00:02:42Z
published_at: 2022-10-05T00:05:59Z
updated_at: 2022-10-05T00:05:59Z
body:
  - Initial release. Provides a mechanism for toggling specific tables public even if the overall Datasette instance is private. [#1](https://github.com/simonw/datasette-public/issues/1)


html_url: https://github.com/simonw/datasette-search-all/releases/tag/1.1
node_id: RE_kwDODqd5284EtaMg
tag_name: 1.1
target_commitish: main
name: 1.1
created_at: 2022-10-05T01:52:37Z
published_at: 2022-10-05T01:53:33Z
updated_at: 2022-10-05T01:53:33Z
body:
  - Plugin now checks table permissions, and only attempts to search tables that the user has permission to view. [#16](https://github.com/simonw/datasette-search-all/issues/16)
  - Now requires Datasette 0.61 or higher


html_url: https://github.com/simonw/datasette-sentry/releases/tag/0.3
node_id: RE_kwDODh5N084EuL5i
tag_name: 0.3
target_commitish: main
name: 0.3
created_at: 2022-10-06T22:29:42Z
published_at: 2022-10-06T22:31:29Z
body:
  - Sentry errors now include information about the HTTP request again. [#4](https://github.com/simonw/datasette-sentry/issues/4)
  - New `sample_rate` plugin configuration option for setting the [Sentry sample rate](https://docs.sentry.io/platforms/python/configuration/sampling/) - accepts a floating point number between 0.0 and 1.0. [#2](https://github.com/simonw/datasette-sentry/issues/2)


html_url: https://github.com/datasette/datasette-public/releases/tag/0.2
node_id: RE_kwDOIIe2Hs4EukjZ
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2022-10-07T22:33:04Z
published_at: 2022-10-07T22:34:48Z
updated_at: 2022-10-07T22:34:48Z
body:
  - Fix compatibility bug when installed alongside `datasette-leaflet-geojson`. [#4](https://github.com/simonw/datasette-public/issues/4)
  - The `execute-sql` permission check now checks to see if the user has the `view-database` permission. [#3](https://github.com/simonw/datasette-public/issues/3)


html_url: https://github.com/simonw/shot-scraper/releases/tag/0.17
node_id: RE_kwDOG-A5W84ExAab
tag_name: 0.17
target_commitish: main
name: 0.17
created_at: 2022-10-14T19:30:50Z
published_at: 2022-10-14T19:32:23Z
updated_at: 2022-10-14T19:32:23Z
body:
  - New `shot-scraper multi -o` option for specifying a subset of one or more output files to execute that are defined in the YAML. This is useful for testing a larger `shots.yml` file without re-taking every screenshot every time the command is run. [#94](https://github.com/simonw/shot-scraper/issues/94)


html_url: https://github.com/simonw/shot-scraper/releases/tag/1.0
node_id: RE_kwDOG-A5W84ExKln
tag_name: 1.0
target_commitish: main
name: 1.0
created_at: 2022-10-15T19:45:04Z
published_at: 2022-10-15T19:46:37Z
updated_at: 2022-10-15T19:46:37Z
body:
  - New `shot-scraper html URL` command ([documented here](https://shot-scraper.datasette.io/en/stable/html.html)) for outputting the final HTML of a page, after JavaScript has been executed. [#96](https://github.com/simonw/shot-scraper/issues/96)
  - `shot-scraper javascript` has a new `-r/--raw` option for outputting the result of the JavaScript expression as a raw string rather than JSON encoded ([shot-scraper javascript documentation](https://shot-scraper.datasette.io/en/stable/javascript.html)). [#95](https://github.com/simonw/shot-scraper/issues/95)
  - Tutorial: [Automating screenshots for the Datasette documentation using shot-scraper](https://simonwillison.net/2022/Oct/14/automating-screenshots/).


html_url: https://github.com/hydrosquall/datasette-nteract-data-explorer/releases/tag/0.5.0
node_id: RE_kwDOHEflbM4EyNdv
tag_name: 0.5.0
target_commitish: main
name: 0.5.0 - Datasette-Lite Compatibility Patch
created_at: 2022-10-18T23:51:40Z
published_at: 2022-10-18T23:54:42Z
body:
  ## What's Changed

  * feat: disable URL state sync feature when running in datasette-lite by @hydrosquall in https://github.com/hydrosquall/datasette-nteract-data-explorer/pull/30

  **Full Changelog**: https://github.com/hydrosquall/datasette-nteract-data-explorer/compare/0.4.2...0.5.0


html_url: https://github.com/hydrosquall/datasette-nteract-data-explorer/releases/tag/0.5.1
node_id: RE_kwDOHEflbM4EyNk5
tag_name: 0.5.1
target_commitish: main
name: 0.5.1
created_at: 2022-10-19T00:06:35Z
published_at: 2022-10-19T00:07:29Z
body:
  ## What's Changed
  * docs: Update the release action trigger guidelines in CONTRIBUTING.md by @hydrosquall in https://github.com/hydrosquall/datasette-nteract-data-explorer/pull/33
  * fix: reverse inverted boolean for datasette membership test by @hydrosquall in https://github.com/hydrosquall/datasette-nteract-data-explorer/pull/34


  **Full Changelog**: https://github.com/hydrosquall/datasette-nteract-data-explorer/compare/0.5.0...0.5.1


html_url: https://github.com/simonw/datasette-gunicorn/releases/tag/0.1
node_id: RE_kwDOISPElM4Ez40F
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2022-10-22T20:55:47Z
published_at: 2022-10-22T20:57:44Z
body:
  - Initial release. `datasette gunicorn my.db -w 4` starts Datasette using [Gunicorn](https://gunicorn.org/) with four workers. [#1](https://github.com/simonw/datasette-gunicorn/issues/1)


html_url: https://github.com/simonw/datasette/releases/tag/0.63a1
node_id: RE_kwDOBm6k_c4E0CdG
tag_name: 0.63a1
target_commitish: main
name: 0.63a1
created_at: 2022-10-24T03:07:09Z
published_at: 2022-10-24T03:11:47Z
updated_at: 2022-10-24T03:11:47Z
body:
  - SQL query is now re-displayed when terminated with a time limit error. ([#1819](https://github.com/simonw/datasette/issues/1819))
  - New documentation on [Running Datasette using OpenRC](https://docs.datasette.io/en/latest/deploying.html#deploying-openrc) - thanks, Adam Simpson. ([#1825](https://github.com/simonw/datasette/pull/1825))
  - The [inspect data](https://docs.datasette.io/en/latest/performance.html#performance-inspect) mechanism is now used to speed up server startup - thanks, Forest Gregg. ([#1834](https://github.com/simonw/datasette/issues/1834))
  - In [Configuration directory mode](https://docs.datasette.io/en/latest/settings.html#config-dir) databases with filenames ending in `.sqlite` or `.sqlite3` are now automatically added to the Datasette instance. ([#1646](https://github.com/simonw/datasette/issues/1646))
  - Breadcrumb navigation display now respects the current user's permissions. ([#1831](https://github.com/simonw/datasette/issues/1831))
  - Screenshots in the documentation are now maintained using [shot-scraper](https://shot-scraper.datasette.io/), as described in [Automating screenshots for the Datasette documentation using shot-scraper](https://simonwillison.net/2022/Oct/14/automating-screenshots/). ([#1844](https://github.com/simonw/datasette/issues/1844))
  - The [datasette.check_visibility()](https://docs.datasette.io/en/latest/internals.html#datasette-check-visibility) method now accepts an optional `permissions=` list, allowing it to take multiple permissions into account at once when deciding if something should be shown as public or private. This has been used to correctly display padlock icons in more places in the Datasette interface. ([#1829](https://github.com/simonw/datasette/issues/1829))

reactions:
  {"url": "https://api.github.com/repos/simonw/datasette/releases/80750406/reactions", "total_count": 2, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 2, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/shot-scraper/releases/tag/1.0.1
node_id: RE_kwDOG-A5W84E0b4Z
tag_name: 1.0.1
target_commitish: main
name: 1.0.1
created_at: 2022-10-24T23:06:56Z
published_at: 2022-10-24T23:07:59Z
updated_at: 2022-10-24T23:07:59Z
body:
  - [shot-scraper.datasette.io](https://shot-scraper.datasette.io/) homepage now includes an example screenshot. [#97](https://github.com/simonw/shot-scraper/issues/97)

reactions:
  {"url": "https://api.github.com/repos/simonw/shot-scraper/releases/80854553/reactions", "total_count": 1, "+1": 0, "-1": 0, "laugh": 0, "hooray": 1, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/datasette-indieauth/releases/tag/1.2.1
node_id: RE_kwDOEqb-cc4E0eHL
tag_name: 1.2.1
target_commitish: main
name: 1.2.1
created_at: 2022-10-25T01:33:36Z
published_at: 2022-10-25T01:34:47Z
body:
  - Upgraded for compatibility with latest Datasette. [#24](https://github.com/simonw/datasette-indieauth/issues/24), [#25](https://github.com/simonw/datasette-indieauth/issues/25)
  - Dropped support for Python 3.6.


html_url: https://github.com/simonw/sqlite-utils/releases/tag/3.30
node_id: RE_kwDOCGYnMM4E06wk
tag_name: 3.30
target_commitish: main
name: 3.30
created_at: 2022-10-25T22:34:30Z
published_at: 2022-10-25T22:34:48Z
updated_at: 2022-10-25T22:34:48Z
body:
  - Now tested against Python 3.11. ([#502](https://github.com/simonw/sqlite-utils/issues/502))
  - New `table.search_sql(include_rank=True)` option, which adds a `rank` column to the generated SQL. Thanks, Jacob Chapman. ([#480](https://github.com/simonw/sqlite-utils/pull/480))
  - Progress bars now display for newline-delimited JSON files using the `--nl` option. Thanks, Mischa Untaga. ([#485](https://github.com/simonw/sqlite-utils/issues/485))
  - New `db.close()` method. ([#504](https://github.com/simonw/sqlite-utils/issues/504))
  - Conversion functions passed to [table.convert(...)](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-convert) can now return lists or dictionaries, which will be inserted into the database as JSON strings. ([#495](https://github.com/simonw/sqlite-utils/issues/495))
  - `sqlite-utils install` and `sqlite-utils uninstall` commands for installing packages into the same virtual environment as `sqlite-utils`, [described here](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-install). ([#483](https://github.com/simonw/sqlite-utils/issues/483))
  - New [sqlite_utils.utils.flatten()](https://sqlite-utils.datasette.io/en/stable/reference.html#reference-utils-flatten) utility function. ([#500](https://github.com/simonw/sqlite-utils/issues/500))
  - Documentation on [using Just](https://sqlite-utils.datasette.io/en/stable/contributing.html#contributing-just) to run tests, linters and build documentation.
  - Documentation now covers the [Release process](https://sqlite-utils.datasette.io/en/stable/contributing.html#release-process) for this package.


html_url: https://github.com/simonw/datasette/releases/tag/0.63
node_id: RE_kwDOBm6k_c4E1_dR
tag_name: 0.63
target_commitish: main
name: 0.63
created_at: 2022-10-27T22:11:26Z
published_at: 2022-10-27T22:13:32Z
updated_at: 2022-10-27T22:13:32Z
body:
  See [Datasette 0.63: The annotated release notes](https://simonwillison.net/2022/Oct/27/datasette-0-63/) for more background on the changes in this release.

  ## Features

  - Now tested against Python 3.11. Docker containers used by `datasette publish` and `datasette package` both now use that version of Python. ([#1853](https://github.com/simonw/datasette/issues/1853))
  - `--load-extension` option now supports entrypoints. Thanks, Alex Garcia. ([#1789](https://github.com/simonw/datasette/pull/1789))
  - Facet size can now be set per-table with the new `facet_size` table metadata option. ([#1804](https://github.com/simonw/datasette/issues/1804))
  - The [truncate_cells_html](https://docs.datasette.io/en/stable/settings.html#setting-truncate-cells-html) setting now also affects long URLs in columns. ([#1805](https://github.com/simonw/datasette/issues/1805))
  - The non-JavaScript SQL editor textarea now increases height to fit the SQL query. ([#1786](https://github.com/simonw/datasette/issues/1786))
  - Facets are now displayed with better line-breaks in long values. Thanks, Daniel Rech. ([#1794](https://github.com/simonw/datasette/pull/1794))
  - The `settings.json` file used in [Configuration directory mode](https://docs.datasette.io/en/stable/settings.html#config-dir) is now validated on startup. ([#1816](https://github.com/simonw/datasette/issues/1816))
  - SQL queries can now include leading SQL comments, using `/* ... */` or `-- ...` syntax. Thanks, Charles Nepote. ([#1860](https://github.com/simonw/datasette/issues/1860))
  - SQL query is now re-displayed when terminated with a time limit error. ([#1819](https://github.com/simonw/datasette/issues/1819))
  - The [inspect data](https://docs.datasette.io/en/stable/performance.html#performance-inspect) mechanism is now used to speed up server startup - thanks, Forest Gregg. ([#1834](https://github.com/simonw/datasette/issues/1834))
  - In [Configuration directory mode](https://docs.datasette.io/en/stable/settings.html#config-dir) databases with filenames ending in `.sqlite` or `.sqlite3` are now automatically added to the Datasette instance. ([#1646](https://github.com/simonw/datasette/issues/1646))
  - Breadcrumb navigation display now respects the current user's permissions. ([#1831](https://github.com/simonw/datasette/issues/1831))

  ## Plugin hooks and internals

  - The [prepare_jinja2_environment(env, datasette)](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-prepare-jinja2-environment) plugin hook now accepts an optional `datasette` argument. Hook implementations can also now return an `async` function which will be awaited automatically. ([#1809](https://github.com/simonw/datasette/issues/1809))
  - `Database(is_mutable=)` now defaults to `True`. ([#1808](https://github.com/simonw/datasette/issues/1808))
  - The [datasette.check_visibility()](https://docs.datasette.io/en/stable/internals.html#datasette-check-visibility) method now accepts an optional `permissions=` list, allowing it to take multiple permissions into account at once when deciding if something should be shown as public or private. This has been used to correctly display padlock icons in more places in the Datasette interface. ([#1829](https://github.com/simonw/datasette/issues/1829))
  - Datasette no longer enforces upper bounds on its dependencies. ([#1800](https://github.com/simonw/datasette/issues/1800))

  ## Documentation

  - New tutorial: [Cleaning data with sqlite-utils and Datasette](https://datasette.io/tutorials/clean-data).
  - Screenshots in the documentation are now maintained using [shot-scraper](https://shot-scraper.datasette.io/), as described in [Automating screenshots for the Datasette documentation using shot-scraper](https://simonwillison.net/2022/Oct/14/automating-screenshots/). ([#1844](https://github.com/simonw/datasette/issues/1844))
  - More detailed command descriptions on the [CLI reference](https://docs.datasette.io/en/stable/cli-reference.html#cli-reference) page. ([#1787](https://github.com/simonw/datasette/issues/1787))
  - New documentation on [Running Datasette using OpenRC](https://docs.datasette.io/en/stable/deploying.html#deploying-openrc) - thanks, Adam Simpson. ([#1825](https://github.com/simonw/datasette/pull/1825))

reactions:
  {"url": "https://api.github.com/repos/simonw/datasette/releases/81262417/reactions", "total_count": 1, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 1, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/datasette-edit-templates/releases/tag/0.1
node_id: RE_kwDOEmnmRs4E1_9V
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2022-10-27T22:53:40Z
published_at: 2022-10-27T22:54:35Z
updated_at: 2022-10-27T22:54:35Z
body:
  - Now depends on [Datasette 0.63](https://docs.datasette.io/en/stable/changelog.html#v0-63), replacing an ugly plugin hook workaround.


html_url: https://github.com/eyeseast/geocode-sqlite/releases/tag/v0.7.0
node_id: RE_kwDOEXxXas4E3I8K
tag_name: v0.7.0
target_commitish: main
name: OpenCage
created_at: 2022-10-31T15:03:29Z
published_at: 2022-10-31T15:07:47Z
body:
  The [OpenCage](https://opencagedata.com/) geocoding service is now supported. Thanks @sbscully. This library is now tested on Python 3.11.

  ## What's Changed
  * Add OpenCage option to CLI by @sbscully in https://github.com/eyeseast/geocode-sqlite/pull/39

  ## New Contributors
  * @sbscully made their first contribution in https://github.com/eyeseast/geocode-sqlite/pull/39

  **Full Changelog**: https://github.com/eyeseast/geocode-sqlite/compare/v0.6.1...v0.7.0


html_url: https://github.com/eyeseast/geocode-sqlite/releases/tag/v0.8.0
node_id: RE_kwDOEXxXas4E5k20
tag_name: v0.8.0
target_commitish: main
name: Capture raw geocoding response
created_at: 2022-11-06T16:58:06Z
published_at: 2022-11-06T16:59:21Z
body:
  ## What's Changed
  * Just a typo! by @shaver in https://github.com/eyeseast/geocode-sqlite/pull/40
  * Capture raw geocoding results by @eyeseast in https://github.com/eyeseast/geocode-sqlite/pull/41

  ## New Contributors
  * @shaver made their first contribution in https://github.com/eyeseast/geocode-sqlite/pull/40

  **Full Changelog**: https://github.com/eyeseast/geocode-sqlite/compare/v0.7.0...v0.8.0


html_url: https://github.com/eyeseast/geocode-sqlite/releases/tag/v0.8.1
node_id: RE_kwDOEXxXas4E5k7K
tag_name: v0.8.1
target_commitish: main
name: v0.8.1
created_at: 2022-11-06T17:10:17Z
published_at: 2022-11-06T17:11:24Z
body:
  ## What's Changed
  * Raw results in geocode_table, too by @eyeseast in https://github.com/eyeseast/geocode-sqlite/pull/42

  **Full Changelog**: https://github.com/eyeseast/geocode-sqlite/compare/v0.8.0...v0.8.1


html_url: https://github.com/eyeseast/geocode-sqlite/releases/tag/v0.8.2
node_id: RE_kwDOEXxXas4E58Xf
tag_name: v0.8.2
target_commitish: main
name: v0.8.2
created_at: 2022-11-07T17:28:31Z
published_at: 2022-11-07T17:31:06Z
body:
  ## What's Changed
  * Require requests. More forgiving timeout. by @eyeseast in https://github.com/eyeseast/geocode-sqlite/pull/43


  **Full Changelog**: https://github.com/eyeseast/geocode-sqlite/compare/v0.8.1...v0.8.2


html_url: https://github.com/simonw/datasette/releases/tag/0.63.1
node_id: RE_kwDOBm6k_c4E7ubF
tag_name: 0.63.1
target_commitish: main
name: 0.63.1
created_at: 2022-11-11T07:01:20Z
published_at: 2022-11-11T07:02:36Z
updated_at: 2022-11-11T07:02:36Z
body:
  - Fixed a bug where Datasette's table filter form would not redirect correctly when run behind a proxy using the [base_url](https://docs.datasette.io/en/stable/settings.html#setting-base-url) setting. ([#1883](https://github.com/simonw/datasette/issues/1883))
  - SQL query is now shown wrapped in a `<textarea>` if a query exceeds a time limit. ([#1876](https://github.com/simonw/datasette/issues/1876))
  - Fixed an intermittent "Too many open files" error while running the test suite. ([#1843](https://github.com/simonw/datasette/issues/1843))
  - New [db.close()](https://docs.datasette.io/en/stable/internals.html#database-close) internal method.

reactions:
  {"url": "https://api.github.com/repos/simonw/datasette/releases/82765509/reactions", "total_count": 1, "+1": 1, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/datasette-configure-fts/releases/tag/1.1.1
node_id: RE_kwDODolrvM4E-fSZ
tag_name: 1.1.1
target_commitish: main
name: 1.1.1
created_at: 2022-11-18T03:47:54Z
published_at: 2022-11-18T03:50:16Z
updated_at: 2022-11-18T03:50:16Z
body:
  - Fixes for compatibility with latest Datasette. [#13](https://github.com/simonw/datasette-configure-fts/issues/13)


html_url: https://github.com/simonw/datasette-edit-templates/releases/tag/0.2
node_id: RE_kwDOEmnmRs4E-fnQ
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2022-11-18T04:05:14Z
published_at: 2022-11-18T04:06:37Z
updated_at: 2022-11-18T04:06:37Z
body:
  - Fixed **security bug** where logged out users were able to edit templates.
  - Introduced new `edit-templates` permission for controlling who can edit templates. [#2](https://github.com/simonw/datasette-edit-templates/issues/2)
  - Fix for breadcrumbs with latest version of Datasette.


html_url: https://github.com/datasette/datasette-import-table/releases/tag/0.3.1
node_id: RE_kwDOEdVnoc4E-hPD
tag_name: 0.3.1
target_commitish: main
name: 0.3.1
created_at: 2022-11-18T06:28:35Z
published_at: 2022-11-18T06:30:26Z
body:
  - Fixed bug where the specified database was not used for the newly created table - it would be created in the first attached database instead. [#8](https://github.com/simonw/datasette-import-table/issues/8)
  - Fixed breadcrumb display in Datasette 0.63.


html_url: https://github.com/simonw/datasette/releases/tag/0.63.2
node_id: RE_kwDOBm6k_c4E_AKz
tag_name: 0.63.2
target_commitish: 0.63.x
name: 0.63.2
created_at: 2022-11-19T00:53:05Z
published_at: 2022-11-19T00:58:27Z
updated_at: 2022-11-19T00:58:27Z
body:
  -   Fixed a bug in `datasette publish heroku` where deployments failed due to an older version of Python being requested. ([#1905](https://github.com/simonw/datasette/issues/1905))
  -   New `datasette publish heroku --generate-dir <dir>` option for generating a Heroku deployment directory without deploying it.


html_url: https://github.com/simonw/datasette-graphql/releases/tag/2.1.2
node_id: RE_kwDOEPNYIc4E_Aez
tag_name: 2.1.2
target_commitish: main
name: 2.1.2
created_at: 2022-11-19T01:30:18Z
published_at: 2022-11-19T01:31:36Z
updated_at: 2022-11-19T01:31:36Z
body:
  - Fixed bug where columns with names starting with a double underscore would cause errors. [#91](https://github.com/simonw/datasette-graphql/issues/91)


html_url: https://github.com/simonw/datasette-export/releases/tag/0.1a0
node_id: RE_kwDOIgngcM4FBZVH
tag_name: 0.1a0
target_commitish: main
name: 0.1a0
created_at: 2022-11-27T04:19:30Z
published_at: 2022-11-27T04:20:09Z
body:
  - Initial alpha release. `datasette export` command for exporting paths to files on disk. [#1](https://github.com/simonw/datasette-export/issues/1)


html_url: https://github.com/simonw/datasette/releases/tag/1.0a0
node_id: RE_kwDOBm6k_c4FCU8U
tag_name: 1.0a0
target_commitish: main
name: 1.0a0
created_at: 2022-11-29T19:57:54Z
published_at: 2022-11-29T19:58:55Z
updated_at: 2022-11-29T19:58:55Z
body:
  This first alpha release of Datasette 1.0 introduces a brand new collection of APIs for writing to the database ([#1850](https://github.com/simonw/datasette/issues/1850)), as well as a new API token mechanism baked into Datasette core. Previously, API tokens have only been supported by installing additional plugins.

  This is very much a preview: expect many more backwards incompatible API changes prior to the full 1.0 release.

  Feedback enthusiastically welcomed, either through [issue comments](https://github.com/simonw/datasette/issues/1850) or via the [Datasette Discord](https://datasette.io/discord) community.

  ### Signed API tokens

  - New `/-/create-token` page allowing authenticated users to create signed API tokens that can act on their behalf, see [API Tokens](https://docs.datasette.io/en/1.0-dev/authentication.html#createtokenview). ([#1852](https://github.com/simonw/datasette/issues/1852))
  - New `datasette create-token` command for creating tokens from the command line: [datasette create-token](https://docs.datasette.io/en/1.0-dev/authentication.html#authentication-cli-create-token).
  - New [allow_signed_tokens](https://docs.datasette.io/en/1.0-dev/settings.html#setting-allow-signed-tokens) setting which can be used to turn off signed token support. ([#1856](https://github.com/simonw/datasette/issues/1856))
  - New [max_signed_tokens_ttl](https://docs.datasette.io/en/1.0-dev/settings.html#setting-max-signed-tokens-ttl) setting for restricting the maximum allowed duration of a signed token. ([#1858](https://github.com/simonw/datasette/issues/1858))

  ### Write API

  - New API explorer at `/-/api` for trying out the API. ([#1871](https://github.com/simonw/datasette/issues/1871))
  - `/db/-/create` API for [Creating a table](https://docs.datasette.io/en/1.0-dev/json_api.html#tablecreateview). ([#1882](https://github.com/simonw/datasette/issues/1882))
  - `/db/table/-/insert` API for [Inserting rows](https://docs.datasette.io/en/1.0-dev/json_api.html#tableinsertview). ([#1851](https://github.com/simonw/datasette/issues/1851))
  - `/db/table/-/drop` API for [Dropping tables](https://docs.datasette.io/en/1.0-dev/json_api.html#tabledropview). ([#1874](https://github.com/simonw/datasette/issues/1874))
  - `/db/table/pk/-/update` API for [Updating a row](https://docs.datasette.io/en/1.0-dev/json_api.html#rowupdateview). ([#1863](https://github.com/simonw/datasette/issues/1863))
  - `/db/table/pk/-/delete` API for [Deleting a row](https://docs.datasette.io/en/1.0-dev/json_api.html#rowdeleteview). ([#1864](https://github.com/simonw/datasette/issues/1864))

reactions:
  {"url": "https://api.github.com/repos/simonw/datasette/releases/84496148/reactions", "total_count": 2, "+1": 0, "-1": 0, "laugh": 0, "hooray": 2, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/datasette-ephemeral-tables/releases/tag/0.1
node_id: RE_kwDOIhvnWc4FCZms
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2022-11-29T23:46:10Z
published_at: 2022-11-29T23:47:26Z
updated_at: 2022-11-29T23:47:26Z
body:
  - Initial release. Plugin creates an `ephemeral` named in-memory database - any tables added to that database will be automatically dropped after 5 minutes (configurable). [#1](https://github.com/simonw/datasette-ephemeral-tables/issues/1)


html_url: https://github.com/simonw/datasette-ephemeral-tables/releases/tag/0.2
node_id: RE_kwDOIhvnWc4FCbFx
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2022-11-30T01:48:18Z
published_at: 2022-11-30T01:49:02Z
updated_at: 2022-11-30T01:49:02Z
body:
  - Table page now shows a countdown timer indicating how long until the table expires. [#3](https://github.com/simonw/datasette-ephemeral-tables/issues/3)


html_url: https://github.com/simonw/datasette-ephemeral-tables/releases/tag/0.2.1
node_id: RE_kwDOIhvnWc4FCdA1
tag_name: 0.2.1
target_commitish: main
name: 0.2.1
created_at: 2022-11-30T04:35:37Z
published_at: 2022-11-30T04:36:32Z
updated_at: 2022-11-30T04:36:32Z
body:
  - Fixed performance bug with JavaScript that updated the countdown timer on the table page. [#4](https://github.com/simonw/datasette-ephemeral-tables/issues/4)


html_url: https://github.com/simonw/datasette/releases/tag/1.0a1
node_id: RE_kwDOBm6k_c4FDUUm
tag_name: 1.0a1
target_commitish: main
name: 1.0a1
created_at: 2022-12-01T21:30:39Z
published_at: 2022-12-01T21:42:45Z
updated_at: 2022-12-01T21:42:45Z
body:
  - Write APIs now serve correct CORS headers if Datasette is started in `--cors` mode. See the full list of [CORS headers](https://docs.datasette.io/en/latest/json_api.html#json-api) in the documentation. ([#1922](https://github.com/simonw/datasette/issues/1922))
  - Fixed a bug where the `_memory` database could be written to even though writes were not persisted. ([#1917](https://github.com/simonw/datasette/issues/1917))
  - The <https://latest.datasette.io/> demo instance now includes an `ephemeral` database which can be used to test Datasette's write APIs, using the new [datasette-ephemeral-tables](https://datasette.io/plugins/datasette-ephemeral-tables) plugin to drop any created tables after five minutes. This database is only available if you sign in as the root user using the link on the homepage. ([#1915](https://github.com/simonw/datasette/issues/1915))
  - Fixed a bug where hitting the write endpoints with a `GET` request returned a 500 error. It now returns a 405 (method not allowed) error instead. ([#1916](https://github.com/simonw/datasette/issues/1916))
  - The list of endpoints in the API explorer now lists mutable databases first. ([#1918](https://github.com/simonw/datasette/issues/1918))
  - The `"ignore": true` and `"replace": true` options for the insert API are [now documented](https://docs.datasette.io/en/latest/json_api.html#tableinsertview). ([#1924](https://github.com/simonw/datasette/issues/1924))


html_url: https://github.com/simonw/datasette-ephemeral-tables/releases/tag/0.2.2
node_id: RE_kwDOIhvnWc4FDWv-
tag_name: 0.2.2
target_commitish: main
name: 0.2.2
created_at: 2022-12-02T00:35:52Z
published_at: 2022-12-02T00:36:31Z
updated_at: 2022-12-02T00:36:46Z
body:
  - Fix for bug where tables with names that contained hyphens were not correctly dropped. [#5](https://github.com/simonw/datasette-ephemeral-tables/issues/5)


html_url: https://github.com/datasette/datasette-public/releases/tag/0.2.2
node_id: RE_kwDOIIe2Hs4FDt8n
tag_name: 0.2.2
target_commitish: main
name: 0.2.2
created_at: 2022-12-02T21:06:28Z
published_at: 2022-12-02T21:09:02Z
updated_at: 2022-12-02T21:09:02Z
body:
  - Plugin can now be used to make SQL views public in addition to SQL tables. [#5](https://github.com/simonw/datasette-public/issues/5)


html_url: https://github.com/simonw/datasette-render-binary/releases/tag/0.3.1
node_id: RE_kwDOC2LHUM4FGnhv
tag_name: 0.3.1
target_commitish: master
name: 0.3.1
created_at: 2022-12-10T06:43:39Z
published_at: 2022-12-10T06:44:18Z
body:
  - Updated for compatibility with latest Jinja. [#4](https://github.com/simonw/datasette-render-binary/issues/4)


html_url: https://github.com/simonw/datasette-secret-santa/releases/tag/0.1
node_id: RE_kwDOIl_N484FGs5F
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2022-12-11T01:39:57Z
published_at: 2022-12-11T01:41:10Z
body:
  - Added instructions for deploying this on Glitch.
  - Homepage now links to create a secret santa if none exist. [#8](https://github.com/simonw/datasette-secret-santa/issues/8)


html_url: https://github.com/simonw/datasette-media/releases/tag/0.5.1
node_id: RE_kwDOD5g6984FHzvK
tag_name: 0.5.1
target_commitish: main
name: 0.5.1
created_at: 2022-12-13T20:01:53Z
published_at: 2022-12-13T20:03:51Z
body:
  - Fixed bug where blank images in the database caused a 500 errors. They are now returned as a 404 status code with a 1x1 pixel white PNG. [#25](https://github.com/simonw/datasette-media/issues/25)


html_url: https://github.com/simonw/datasette-ripgrep/releases/tag/0.8
node_id: RE_kwDOEtKqL84FIc7o
tag_name: 0.8
target_commitish: main
name: 0.8
created_at: 2022-12-15T01:12:17Z
published_at: 2022-12-15T01:13:08Z
updated_at: 2022-12-15T01:13:08Z
body:
  - Search results now show a visible gap between different ranges of line numbers. [#27](https://github.com/simonw/datasette-ripgrep/issues/27)
  - Python 3.6 is no longer supported.


html_url: https://github.com/simonw/datasette/releases/tag/1.0a2
node_id: RE_kwDOBm6k_c4FIdd4
tag_name: 1.0a2
target_commitish: main
name: 1.0a2
created_at: 2022-12-15T02:02:42Z
published_at: 2022-12-15T02:03:59Z
updated_at: 2022-12-16T00:59:53Z
body:
  The third Datasette 1.0 alpha release adds upsert support to the JSON API, plus the ability to specify finely grained permissions when creating an API token.

  See [Datasette 1.0a2: Upserts and finely grained permissions](https://simonwillison.net/2022/Dec/15/datasette-1a2/) for an extended, annotated version of these release notes.

  - New `/db/table/-/upsert` API, [documented here](https://docs.datasette.io/en/latest/json_api.html#tableupsertview). upsert is an update-or-insert: existing rows will have specified keys updated, but if no row matches the incoming primary key a brand new row will be inserted instead. ([#1878](https://github.com/simonw/datasette/issues/1878))
  - New [register_permissions(datasette)](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-register-permissions) plugin hook. Plugins can now register named permissions, which will then be listed in various interfaces that show available permissions. ([#1940](https://github.com/simonw/datasette/issues/1940))
  - The `/db/-/create` API for [creating a table](https://docs.datasette.io/en/latest/json_api.html#tablecreateview) now accepts `"ignore": true` and `"replace": true` options when called with the `"rows"` property that creates a new table based on an example set of rows. This means the API can be called multiple times with different rows, setting rules for what should happen if a primary key collides with an existing row. ([#1927](https://github.com/simonw/datasette/issues/1927))
  - Arbitrary permissions can now be configured at the instance, database and resource (table, SQL view or canned query) level in Datasette's [Metadata](https://docs.datasette.io/en/latest/metadata.html#metadata) JSON and YAML files. The new `"permissions"` key can be used to specify which actors should have which permissions. See [Other permissions in metadata](https://docs.datasette.io/en/latest/authentication.html#authentication-permissions-other) for details. ([#1636](https://github.com/simonw/datasette/issues/1636))
  - The `/-/create-token` page can now be used to create API tokens which are restricted to just a subset of actions, including against specific databases or resources. See [API Tokens](https://docs.datasette.io/en/latest/authentication.html#createtokenview) for details. ([#1947](https://github.com/simonw/datasette/issues/1947))
  - Likewise, the [datasette create-token](https://docs.datasette.io/en/latest/internals.html#create-token-actor-id-expires-after-none-restrict-all-none-restrict-database-none-restrict-resource-none) CLI command can now create tokens with [a subset of permissions](https://docs.datasette.io/en/latest/authentication.html#authentication-cli-create-token-restrict). ([#1855](https://github.com/simonw/datasette/issues/1855))
  - New datasette.create_token() API method <datasette_create_token>` for programmatically creating signed API tokens. ([#1951](https://github.com/simonw/datasette/issues/1951))
  - `/db/-/create` API now requires actor to have `insert-row` permission in order to use the `"row"` or `"rows"` properties. ([#1937](https://github.com/simonw/datasette/issues/1937))


html_url: https://github.com/simonw/datasette/releases/tag/0.63.3
node_id: RE_kwDOBm6k_c4FJr6a
tag_name: 0.63.3
target_commitish: 0.63.x
name: 0.63.3
created_at: 2022-12-18T03:08:01Z
published_at: 2022-12-18T03:10:52Z
updated_at: 2022-12-18T03:10:52Z
body:
  - Fixed a bug where `datasette --root`, when running in Docker, would only output the URL to sign in as root when the server shut down, not when it started up. ([#1958](https://github.com/simonw/datasette/issues/1958))
  - You no longer need to ensure `await datasette.invoke_startup()` has been called in order for Datasette to start correctly serving requests - this is now handled automatically the first time the server receives a request. This fixes a bug experienced when Datasette is served directly by an ASGI application server such as Uvicorn or Gunicorn. It also fixes a bug with the [datasette-gunicorn](https://datasette.io/plugins/datasette-gunicorn) plugin. ([#1955](https://github.com/simonw/datasette/issues/1955))


html_url: https://github.com/simonw/datasette-gunicorn/releases/tag/0.1.1
node_id: RE_kwDOISPElM4FJt0A
tag_name: 0.1.1
target_commitish: 0276401151b575850007c2e97789eddf1a45596d
name: 0.1.1
created_at: 2022-12-18T06:42:52Z
published_at: 2022-12-18T06:46:37Z
body:
  - Fix crashing bug introduced by Datasette 0.63 - now depends on at least Datasette 0.63.2. [#5](https://github.com/simonw/datasette-gunicorn/issues/5)


html_url: https://github.com/simonw/openai-to-sqlite/releases/tag/0.1a0
node_id: RE_kwDOItf8Rs4FOqLA
tag_name: 0.1a0
target_commitish: main
name: 0.1a0
created_at: 2023-01-03T01:23:10Z
published_at: 2023-01-03T01:24:38Z
body:
  - Initial prototype release.
  - `embeddings` and `search` commands. [#1](https://github.com/simonw/openai-to-sqlite/issuse/1)

reactions:
  {"url": "https://api.github.com/repos/simonw/openai-to-sqlite/releases/87728832/reactions", "total_count": 1, "+1": 0, "-1": 0, "laugh": 1, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/datasette-openai/releases/tag/0.1a0
node_id: RE_kwDOItymQM4FO-Vb
tag_name: 0.1a0
target_commitish: main
name: 0.1a0
created_at: 2023-01-03T19:13:04Z
published_at: 2023-01-03T19:17:48Z
body:
  - Initial prototype, with `openai_davinci()`, `openai_embedding()` and `openai_embedding_similarity()` functions. [#1](https://github.com/simonw/datasette-openai/issues/1)


html_url: https://github.com/eyeseast/datasette-geojson/releases/tag/v0.4.0
node_id: RE_kwDOFlezZ84FQZEL
tag_name: v0.4.0
target_commitish: main
name: Handle binary data better
created_at: 2023-01-06T21:21:04Z
published_at: 2023-01-06T21:23:22Z
body:
  - Handle binary data the same as Datasette does with regular JSON
  - Binary columns are served as `{"$base64": true, "encoded": ...}`


html_url: https://github.com/simonw/shapefile-to-sqlite/releases/tag/0.4.2
node_id: RE_kwDODlqPQs4FQp1Y
tag_name: 0.4.2
target_commitish: main
name: 0.4.2
created_at: 2023-01-08T20:21:04Z
published_at: 2023-01-08T20:24:46Z
body:
  - Fix for compatibility with `pyproj` versions 3.4.0 or higher. [#15](https://github.com/simonw/shapefile-to-sqlite/issues/15)


html_url: https://github.com/simonw/datasette-publish-fly/releases/tag/1.3
node_id: RE_kwDODs4PE84FQr68
tag_name: 1.3
target_commitish: main
name: 1.3
created_at: 2023-01-09T02:13:09Z
published_at: 2023-01-09T02:16:07Z
body:
  - New `--setting name value` option and `--crossdb` option as a neater way of applying [Datasette settings](https://docs.datasette.io/en/stable/settings.html). [#25](https://github.com/simonw/datasette-publish-fly/issues/25)
  - Exit code from `datasette publish fly` is now non-zero if the publish command fails - useful for running in CI. [#20](https://github.com/simonw/datasette-publish-fly/issues/20)
  - `--generate-dir` option now correctly handles relative paths, and includes plugins and templates in the generated directory structure. [#18](https://github.com/simonw/datasette-publish-fly/issues/18)


html_url: https://github.com/simonw/datasette/releases/tag/0.64
node_id: RE_kwDOBm6k_c4FQ9U8
tag_name: 0.64
target_commitish: 0.63.x
name: 0.64
created_at: 2023-01-09T16:37:21Z
published_at: 2023-01-09T16:49:04Z
updated_at: 2023-01-09T16:49:04Z
body:
  - Datasette now **strongly recommends against allowing arbitrary SQL queries if you are using SpatiaLite**. SpatiaLite includes SQL functions that could cause the Datasette server to crash. See [SpatiaLite](https://docs.datasette.io/en/stable/spatialite.html#spatialite) for more details.
  - New [default_allow_sql](https://docs.datasette.io/en/stable/settings.html#setting-default-allow-sql) setting, providing an easier way to disable all arbitrary SQL execution by end users: `datasette --setting default_allow_sql off`. See also [Controlling the ability to execute arbitrary SQL](https://docs.datasette.io/en/stable/authentication.html#authentication-permissions-execute-sql). ([#1409](https://github.com/simonw/datasette/issues/1409))
  - [Building a location to time zone API with SpatiaLite](https://datasette.io/tutorials/spatialite) is a new Datasette tutorial showing how to safely use SpatiaLite to create a location to time zone API.
  - New documentation about [how to debug problems loading SQLite extensions](https://docs.datasette.io/en/stable/installation.html#installation-extensions). The error message shown when an extension cannot be loaded has also been improved. ([#1979](https://github.com/simonw/datasette/issues/1979))
  - Fixed an accessibility issue: the `<select>` elements in the table filter form now show an outline when they are currently focused. ([#1771](https://github.com/simonw/datasette/issues/1771))


html_url: https://github.com/simonw/datasette-auth-passwords/releases/tag/1.1
node_id: RE_kwDOEKamw84FRFnD
tag_name: 1.1
target_commitish: main
name: 1.1
created_at: 2023-01-09T20:51:48Z
published_at: 2023-01-09T20:53:59Z
body:
  - Now adds a "Log in" item to the Datasette navigation menu if the user is logged out. [#23](https://github.com/simonw/datasette-auth-passwords/issues/23)
  - Increased password hash iteration to 480,000. [#21](https://github.com/simonw/datasette-auth-passwords/issues/21)


html_url: https://github.com/simonw/datasette/releases/tag/0.64.1
node_id: RE_kwDOBm6k_c4FSEog
tag_name: 0.64.1
target_commitish: 0.64.x
name: 0.64.1
created_at: 2023-01-11T18:21:37Z
published_at: 2023-01-11T18:27:56Z
updated_at: 2023-01-11T18:27:56Z
body:
  - Documentation now links to a current source of information for installing Python 3. ([#1987](https://github.com/simonw/datasette/issues/1987))
  - Incorrectly calling the Datasette constructor using `Datasette("path/to/data.db")` instead of `Datasette(["path/to/data.db"])` now returns a useful error message. ([#1985](https://github.com/simonw/datasette/issues/1985))


html_url: https://github.com/simonw/git-history/releases/tag/0.7a0
node_id: RE_kwDOGXV4Is4FSIja
tag_name: 0.7a0
target_commitish: main
name: 0.7a0
created_at: 2023-01-11T20:13:42Z
published_at: 2023-01-11T20:13:48Z
updated_at: 2023-01-11T20:13:48Z
body:
  - Fixed bug where the item table did not correctly link to the commits using a foreign key. [#59](https://github.com/simonw/git-history/issues/59)
  - Fixed bug where some repositories would not process correctly due to data from older versions not being successfully loaded from the commit history. [#64](https://github.com/simonw/git-history/issues/64)


html_url: https://github.com/simonw/datasette-cookies-for-magic-parameters/releases/tag/0.1
node_id: RE_kwDOIwsDBs4FSMtM
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2023-01-11T22:49:06Z
published_at: 2023-01-11T22:52:56Z
body:
  - Initial release. Adds a form to any canned query that uses `:_cookie_x` parameters allowing the user to set that cookie. [#1](https://github.com/simonw/datasette-cookies-for-magic-parameters/issues/1)


html_url: https://github.com/simonw/datasette-cookies-for-magic-parameters/releases/tag/0.1.1
node_id: RE_kwDOIwsDBs4FSNgp
tag_name: 0.1.1
target_commitish: main
name: 0.1.1
created_at: 2023-01-11T23:41:52Z
published_at: 2023-01-11T23:42:35Z
body:
  - Fixed bug where duplicate mentions of the same parameter name resulted in duplicate form fields. [#2](https://github.com/simonw/datasette-cookies-for-magic-parameters/issues/2)


html_url: https://github.com/simonw/datasette-openai/releases/tag/0.1a2
node_id: RE_kwDOItymQM4FSnY4
tag_name: 0.1a2
target_commitish: main
name: 0.1a2
created_at: 2023-01-12T18:13:26Z
published_at: 2023-01-12T18:16:14Z
body:
  - Returns more detailed error messages if a completion fails. [#6](https://github.com/simonw/datasette-openai/issues/6)
  - `openai_strip_tags()` function. [#5](https://github.com/simonw/datasette-openai/issues/5)
  - `openai_tokenize()` and `openai_count_tokens()` functions. [#7](https://github.com/simonw/datasette-openai/issues/7)
  - A not-yet-documented `openai_build_prompt()` aggregate function. [#4](https://github.com/simonw/datasette-openai/issues/4)


html_url: https://github.com/simonw/datasette-cookies-for-magic-parameters/releases/tag/0.1.2
node_id: RE_kwDOIwsDBs4FSol-
tag_name: 0.1.2
target_commitish: main
name: 0.1.2
created_at: 2023-01-12T19:04:01Z
published_at: 2023-01-12T19:04:37Z
body:
  - Fix for a cookie parsing bug. [#3](https://github.com/simonw/datasette-cookies-for-magic-parameters/issues/3)


html_url: https://github.com/simonw/openai-to-sqlite/releases/tag/0.2
node_id: RE_kwDOItf8Rs4FTEek
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2023-01-13T16:55:40Z
published_at: 2023-01-13T16:59:36Z
body:
  - `openai-to-sqlite embeddings` command can read JSON, CSV or TSV from a file or from standard input and fetch and store embeddings for that data. [#1](https://github.com/simonw/openai-to-sqlite/issues/1)
  - `openai-to-sqlite embeddings --sql` command can read the data to be embedded from a SQL query. [#2](https://github.com/simonw/openai-to-sqlite/issues/2)
  - Data is now sent to the OpenAI API in batches, defaulting to 100 and with a size that can be specified using `--batch-size` up to 2048. [#5](https://github.com/simonw/openai-to-sqlite/issues/5)


html_url: https://github.com/simonw/datasette-openai/releases/tag/0.2
node_id: RE_kwDOItymQM4FTS_p
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2023-01-14T02:26:45Z
published_at: 2023-01-14T02:28:08Z
body:
  - First stable release.
  - [Semantic search answers: Q&A against documentation with GPT3 + OpenAI embeddings](https://simonwillison.net/2023/Jan/13/semantic-search-answers/) provides a live demo and explanation of this project.
  - `openai_build_prompt()` function is now documented. [#4](https://github.com/simonw/datasette-openai/issues/4)


html_url: https://github.com/simonw/datasette-faiss/releases/tag/0.2
node_id: RE_kwDOIwW61s4FV-If
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2023-01-19T23:37:05Z
published_at: 2023-01-19T23:37:56Z
body:
  - New `faiss_agg()` and `faiss_agg_with_scores()` aggregate functions. [#3](https://github.com/simonw/datasette-faiss/issues/3)


html_url: https://github.com/cldellow/datasette-scraper/releases/tag/0.5
node_id: RE_kwDOIhVCu84FWvdB
tag_name: 0.5
target_commitish: master
name: 0.5
created_at: 2023-01-22T18:31:07Z
published_at: 2023-01-22T18:35:54Z
body:
  - feature: generic support for extracting json+ld data
  - feature: specific support for extracting json+ld `Product` data 
  - feature: add `discover-allow` to specify an allowlist of patterns to crawl
  - enhancement: `seed-sitemaps` only activates for seeds that are at the top-level of the domain
  - enhancement: `extract_from_response` can delete existing entries
  - enhancement: `extract_from_response` can add indexed entries with `@` sigil
  - enhancement: `extract_from_response` skips doing writes that wouldn't change the database
  - enhancement: prune pages that exceed max depth/max page limit earlier


html_url: https://github.com/simonw/datasette-youtube-embed/releases/tag/0.1
node_id: RE_kwDOI2nvlM4FZH-H
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2023-01-27T20:06:55Z
published_at: 2023-01-27T20:09:30Z
updated_at: 2023-01-27T20:09:30Z
body:
  - Initial release. Turns YouTube video URLs into embedded video players. [#1](https://github.com/simonw/datasette-youtube-embed/issues/1)


html_url: https://github.com/simonw/datasette-render-markdown/releases/tag/2.1.1
node_id: RE_kwDODSffFs4FZL6g
tag_name: 2.1.1
target_commitish: main
name: 2.1.1
created_at: 2023-01-27T23:30:13Z
published_at: 2023-01-27T23:31:36Z
body:
  - Fixed a bug where `[Links containing & characters](...)` were rendered with the ampersand double-escaped as `&amp;amp;`. [#13](https://github.com/simonw/datasette-render-markdown/issues/13)


html_url: https://github.com/simonw/shot-scraper/releases/tag/1.1
node_id: RE_kwDOG-A5W84FZsxo
tag_name: 1.1
target_commitish: main
name: 1.1
created_at: 2023-01-30T00:54:54Z
published_at: 2023-01-30T00:57:32Z
updated_at: 2023-01-30T00:57:32Z
body:
  - New `--log-console` option for logging the output of calls to `console.log()` to standard error. [#101](https://github.com/simonw/shot-scraper/issues/101)
  - New `--skip` and `--fail` options to specify what should happen if an HTTP 4xx or 5xx error is encountered while trying to load the page. `--skip` will ignore the error and either exit cleanly or move on to the next screenshot (in the case of `multi`). `--fail` will cause the tool to return a non-zero exit code, useful for running in CI environments. [#102](https://github.com/simonw/shot-scraper/issues/102)


html_url: https://github.com/simonw/shot-scraper/releases/tag/1.1.1
node_id: RE_kwDOG-A5W84FZuLJ
tag_name: 1.1.1
target_commitish: main
name: 1.1.1
created_at: 2023-01-30T02:33:55Z
published_at: 2023-01-30T02:34:26Z
updated_at: 2023-01-30T02:34:26Z
body:
  - Deprecated the `shot-scraper multi --fail-on-error` option in favor of the new `--fail` option. `--fail-on-error` will continue to work until `shot-scraper` 2.0 (should that ever be released), but is no longer displayed in the `--help` menu or documentation. [#103](https://github.com/simonw/shot-scraper/issues/103)


html_url: https://github.com/asg017/sqlite-ulid/releases/tag/v0.1.2
node_id: RE_kwDOIpo-2s4Fb3YO
tag_name: v0.1.2
target_commitish: main
name: v0.1.2
created_at: 2023-02-02T21:10:00Z
published_at: 2023-02-02T21:12:21Z
body:
  `sqlite-ulid` can now be installed with `pip install sqlite-ulid`! Also can be used as a Datasette plugin, with `datasette install datasette-sqlite-ulid`


html_url: https://github.com/simonw/db-to-sqlite/releases/tag/1.5
node_id: RE_kwDOCedi4M4FdMRi
tag_name: 1.5
target_commitish: main
name: 1.5
created_at: 2023-02-07T01:08:02Z
published_at: 2023-02-07T01:09:30Z
body:
  - Upgraded for compatibility with SQLAlchemy 2.0. [#46](https://github.com/simonw/db-to-sqlite/issues/46)
  - Now documented to work with MS SQL Server. Thanks, Ryan Cheley. [#37](https://github.com/simonw/db-to-sqlite/pull/37)


html_url: https://github.com/simonw/datasette-codespaces/releases/tag/0.1
node_id: RE_kwDOJBM_kM4FkEMi
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2023-02-22T18:58:03Z
published_at: 2023-02-22T18:59:05Z
body:
  - Initial release. Ensures links work correctly when Datasette is run in Codespaces, and that the user is authenticated as `root` automatically. [#1](https://github.com/simonw/datasette-codespaces/issues/1)


html_url: https://github.com/asg017/sqlite-jsonschema/releases/tag/v0.2.2
node_id: RE_kwDOIX3aMs4FkQ8w
tag_name: v0.2.2
target_commitish: main
name: v0.2.2
created_at: 2023-02-23T05:19:42Z
published_at: 2023-02-23T05:20:52Z
body:
  `sqlite-jsonschema` can now be easy installed with Deno! See the 
  `x/sqlite_jsonschema` module for more.


html_url: https://github.com/simonw/datasette-codespaces/releases/tag/0.1.1
node_id: RE_kwDOJBM_kM4FkuKj
tag_name: 0.1.1
target_commitish: main
name: 0.1.1
created_at: 2023-02-23T23:49:47Z
published_at: 2023-02-23T23:50:40Z
body:
  - README now links to new tutorial on [Using Datasette in GitHub Codespaces](https://datasette.io/tutorials/codespaces).


html_url: https://github.com/asg017/sqlite-regex/releases/tag/v0.2.2
node_id: RE_kwDOIX3Uzc4FkuVL
tag_name: v0.2.2
target_commitish: main
name: v0.2.2
created_at: 2023-02-24T00:03:38Z
published_at: 2023-02-24T00:04:30Z
body: You can now add additional WHERE filters on `regex_split` and `regex_find_all` table functions.
reactions:
  {"url": "https://api.github.com/repos/asg017/sqlite-regex/releases/93513035/reactions", "total_count": 2, "+1": 0, "-1": 0, "laugh": 0, "hooray": 2, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/datasette-app/releases/tag/0.2.3
node_id: RE_kwDOF8z3PM4Fl90U
tag_name: 0.2.3
target_commitish: main
name: 0.2.3
created_at: 2023-02-27T18:38:25Z
published_at: 2023-02-27T18:40:35Z
updated_at: 2023-02-27T18:51:58Z
body:
  - Fixed errors launching initial application. [#153](https://github.com/simonw/datasette-app/issues/153)


html_url: https://github.com/simonw/datasette-simple-html/releases/tag/0.1
node_id: RE_kwDOJDyulc4Fmq5e
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2023-03-01T02:30:22Z
published_at: 2023-03-01T02:35:10Z
body:
  - Initial implementation: `html_strip_tags(text)`, `html_escape(text)` and `html_unescape(text)` SQL functions. [#1](https://github.com/simonw/datasette-simple-html/issues/1)


html_url: https://github.com/cldellow/datasette-scraper/releases/tag/0.5.3
node_id: RE_kwDOIhVCu84FomAM
tag_name: 0.5.3
target_commitish: master
name: 0.5.3
created_at: 2023-03-04T22:08:17Z
published_at: 2023-03-04T22:11:46Z
body:
  Make the UI less daunting by hiding all tables except dss_crawl, and improving links from dss_crawl to dss_job, #51 


html_url: https://github.com/simonw/datasette/releases/tag/0.64.2
node_id: RE_kwDOBm6k_c4FqV22
tag_name: 0.64.2
target_commitish: 0.64.x
name: 0.64.2
created_at: 2023-03-08T20:41:13Z
published_at: 2023-03-08T20:46:27Z
updated_at: 2023-03-08T20:46:27Z
body:
  - Fixed a bug with `datasette publish cloudrun` where deploys all used the same Docker image tag. This was mostly inconsequential as the service is deployed as soon as the image has been pushed to the registry, but could result in the incorrect image being deployed if two different deploys for two separate services ran at exactly the same time. [#2036](https://github.com/simonw/datasette/issues/2036)

reactions:
  {"url": "https://api.github.com/repos/simonw/datasette/releases/94985654/reactions", "total_count": 1, "+1": 1, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/datasette-render-html/releases/tag/1.0
node_id: RE_kwDOCvoxoM4Fqb5H
tag_name: 1.0
target_commitish: master
name: 1.0
created_at: 2023-03-09T02:46:06Z
published_at: 2023-03-09T02:46:43Z
body:
  - Updated to work with recent versions of Jinja. [#4](https://github.com/simonw/datasette-render-html/issus/4)


html_url: https://github.com/dogsheep/apple-notes-to-sqlite/releases/tag/0.1
node_id: RE_kwDOJHON9s4Fqdv2
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2023-03-09T05:11:00Z
published_at: 2023-03-09T05:12:12Z
body:
  - Initial working version. `apple-notes-to-sqlite notes.db` dumps your notes out to a SQLite database.  [#2](https://github.com/dogsheep/apple-notes-to-sqlite/issues/2)
  - `apple-notes-to-sqlite --dump` outputs them to standard output as newline-delimited JSON. [#3](https://github.com/dogsheep/apple-notes-to-sqlite/issues/3)


html_url: https://github.com/simonw/datasette-simple-html/releases/tag/0.2
node_id: RE_kwDOJDyulc4FroEE
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2023-03-12T17:30:09Z
published_at: 2023-03-12T17:30:47Z
body:
  - Fixed a bug where passing `null` to the functions would cause them to return an error. [#2](https://github.com/simonw/datasette-simple-html/issues/2)


html_url: https://github.com/simonw/datasette-atom/releases/tag/0.9
node_id: RE_kwDODHZ6uM4FsQg3
tag_name: 0.9
target_commitish: main
name: 0.9
created_at: 2023-03-14T03:49:42Z
published_at: 2023-03-14T03:50:25Z
updated_at: 2023-03-14T03:50:25Z
body:
  - `<br>` tag is now allowed in `atom_content_html`. [#16](https://github.com/simonw/datasette-atom/issues/16)


html_url: https://github.com/simonw/datasette-graphql/releases/tag/2.2
node_id: RE_kwDOEPNYIc4FwaKz
tag_name: 2.2
target_commitish: main
name: 2.2
created_at: 2023-03-23T04:31:48Z
published_at: 2023-03-23T04:33:18Z
updated_at: 2023-03-23T04:33:18Z
body:
  - The path used by for the GraphQL API - which defaults to `/graphql` - can now be customized using the new `datasette-graphql path` configuration option in `metadata.json`. [#92](https://github.com/simonw/datasette-graphql/issues/92)


html_url: https://github.com/simonw/datasette-chatgpt-plugin/releases/tag/0.1
node_id: RE_kwDOJNnn3s4FxU_1
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2023-03-24T14:31:35Z
published_at: 2023-03-24T14:32:12Z
body:
  - Initial release. Install this plugin to expose the first database in your Datasette instance as [a ChatGPT plugin](https://openai.com/blog/chatgpt-plugins), provided you have preview access to that feature. [#1](https://github.com/simonw/datasette-chatgpt-plugin/issues/1)


html_url: https://github.com/simonw/llm/releases/tag/0.2
node_id: RE_kwDOJRhX7M4F03c0
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2023-04-01T22:29:04Z
published_at: 2023-04-01T22:30:41Z
updated_at: 2023-04-01T22:30:41Z
body:
  - If a SQLite database exists in `~/.llm/log.db` all prompts and responses are logged to that file. The `llm init-db` command can be used to create this file. [#2](https://github.com/simonw/llm/issues/2)


html_url: https://github.com/simonw/datasette-explain/releases/tag/0.1a1
node_id: RE_kwDOI7mujs4F2KXt
tag_name: 0.1a1
target_commitish: main
name: 0.1a1
created_at: 2023-04-04T19:09:25Z
published_at: 2023-04-04T19:10:06Z
body:
  - `:param` parameters in SQL queries are now supported. [#3](https://github.com/simonw/datasette-explain/issues/3)


html_url: https://github.com/asg017/sqlite-vss/releases/tag/v0.0.2
node_id: RE_kwDOIt2TLc4F5E-D
tag_name: v0.0.2
target_commitish: main
name: v0.0.2
created_at: 2023-04-10T22:40:43Z
published_at: 2023-04-10T22:43:14Z
body:
  First "stable" release of `sqlite-vss`, with the following improvements:

  - Distributed on pip for Python developers. Try with `pip install sqlite-vss`
  - Distributed on npm for Node.js developers. Try with `npm install sqlite-vss`
  - Distributed on deno.land/x for Deno developers. See more at https://deno.land/x/sqlite-vss
  - Distributed as a Datasette plugin, try with `datasette install datasette-sqlite-vss`
  - Deprecated the external vector plugin, is now a part of the `sqlite-vss` project.
  - Included more clear instructions for building yourself.


html_url: https://github.com/dogsheep/swarm-to-sqlite/releases/tag/0.3.4
node_id: RE_kwDODD6af84F5IvR
tag_name: 0.3.4
target_commitish: main
name: 0.3.4
created_at: 2023-04-11T03:17:35Z
published_at: 2023-04-11T03:18:16Z
body:
  - Fixed an error in the `checkins_detail` view. [#15](https://github.com/dogsheep/swarm-to-sqlite/issues/15)


html_url: https://github.com/asg017/sqlite-vss/releases/tag/v0.0.4
node_id: RE_kwDOIt2TLc4F-7w2
tag_name: v0.0.4
target_commitish: main
name: v0.0.4
created_at: 2023-04-21T20:28:37Z
published_at: 2023-04-21T20:30:33Z
body:
  There are now pre-built binaries for MacOS ARM! Now Mac M1 and M2 users can `pip install sqlite-vss`, `npm install sqlite-vss`, use https://deno.land/x/sqlite_vss , or download `sqlite-vss` from the Releases page for their platform.


html_url: https://github.com/simonw/datasette-explain/releases/tag/0.1a2
node_id: RE_kwDOI7mujs4F_uon
tag_name: 0.1a2
target_commitish: main
name: 0.1a2
created_at: 2023-04-24T03:56:23Z
published_at: 2023-04-24T03:57:18Z
body:
  - Fix for "You did not supply a value for binding parameter" error. [#4](https://github.com/simonw/datasette-explain/issues/4)


html_url: https://github.com/asg017/sqlite-vss/releases/tag/v0.0.5
node_id: RE_kwDOIt2TLc4GBUeV
tag_name: v0.0.5
target_commitish: main
name: v0.0.5
created_at: 2023-04-26T20:29:27Z
published_at: 2023-04-26T20:30:31Z
body:
  Fixes #18, where interacting with an empty `vss0` table in a new connection would cause a segfault.


html_url: https://github.com/simonw/shot-scraper/releases/tag/1.2
node_id: RE_kwDOG-A5W84GBbMw
tag_name: 1.2
target_commitish: main
name: 1.2
created_at: 2023-04-27T03:02:58Z
published_at: 2023-04-27T03:03:26Z
updated_at: 2023-04-27T05:24:02Z
body:
  - New `--omit-background` option to the `shot` command to optionally create transparent PNGs. Thanks, Ben Welsh. [#108](https://github.com/simonw/shot-scraper/issues/108)
  - Fixed bug that caused `shot-scraper` to fail to take screenshots on Windows. Thanks, Omer Rosenbaum. [#104](https://github.com/simonw/shot-scraper/pull/104)
  - New `--silent` option for the `shot`, `multi`, `pdf` and `html` commands, to disable the default console output. [#107](https://github.com/simonw/shot-scraper/issues/107)

  Full documentation: https://shot-scraper.datasette.io/

reactions:
  {"url": "https://api.github.com/repos/simonw/shot-scraper/releases/101036848/reactions", "total_count": 5, "+1": 3, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 2, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/datasette/releases/tag/0.64.3
node_id: RE_kwDOBm6k_c4GBzhH
tag_name: 0.64.3
target_commitish: 0.64.x
name: 0.64.3
created_at: 2023-04-27T14:55:25Z
published_at: 2023-04-27T15:00:27Z
updated_at: 2023-04-27T15:00:27Z
body:
  - Added `pip` and `setuptools` as explicit dependencies. This fixes a bug where Datasette could not be installed using [Rye](https://github.com/mitsuhiko/rye). ([#2065](https://github.com/simonw/datasette/issues/2065))

reactions:
  {"url": "https://api.github.com/repos/simonw/datasette/releases/101136455/reactions", "total_count": 3, "+1": 1, "-1": 0, "laugh": 0, "hooray": 2, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/openai-to-sqlite/releases/tag/0.3
node_id: RE_kwDOItf8Rs4GCq2B
tag_name: 0.3
target_commitish: main
name: 0.3
created_at: 2023-04-29T06:17:22Z
published_at: 2023-04-29T06:19:00Z
body:
  - New `openai-to-sqlite query data.db SQL` command for executing SQL queries against a database with access to custom OpenAI SQL functions. [#11](https://github.com/simonw/openai-to-sqlite/issues/11)
  - New `chatgpt(prompt)` and `chatgpt(prompt, system_prompt)` SQL functions for use with `openai-to-sqlite query`.

reactions:
  {"url": "https://api.github.com/repos/simonw/openai-to-sqlite/releases/101363073/reactions", "total_count": 3, "+1": 3, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/s3-credentials/releases/tag/0.15
node_id: RE_kwDOGUV9is4GC5VJ
tag_name: 0.15
target_commitish: main
name: 0.15
created_at: 2023-04-30T22:08:14Z
published_at: 2023-04-30T22:09:30Z
updated_at: 2023-04-30T22:09:30Z
body:
  - New `s3-credentials delete-objects` command ([docs](https://s3-credentials.readthedocs.io/en/stable/other-commands.html#delete-objects)) for deleting one or more keys from the specified bucket. [#83](https://github.com/simonw/s3-credentials/issues/83)


html_url: https://github.com/asg017/sqlite-vss/releases/tag/v0.0.6
node_id: RE_kwDOIt2TLc4GDM5L
tag_name: v0.0.6
target_commitish: main
name: v0.0.6
created_at: 2023-05-01T21:12:25Z
published_at: 2023-05-01T21:14:27Z
body:
  Fixed MacOS aarch64 builds (aka M1/M2 macs). The libomp dependency is now statically linked in the `vss0.dylib` extension, removing the need for `brew install libomp`.


html_url: https://github.com/asg017/sqlite-vss/releases/tag/v0.1.0
node_id: RE_kwDOIt2TLc4GDNlS
tag_name: v0.1.0
target_commitish: main
name: v0.1.0
created_at: 2023-05-01T21:55:20Z
published_at: 2023-05-01T22:04:57Z
body:
  A completely unceremonious minor bump. This version is the same as `v0.0.6`, but with a promise that there shall be no breaking change until `v0.2.0`, following semver. Had to do the first minor bump at some point `¯\_(ツ)_/¯`

reactions:
  {"url": "https://api.github.com/repos/asg017/sqlite-vss/releases/101505362/reactions", "total_count": 2, "+1": 0, "-1": 0, "laugh": 0, "hooray": 2, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/sqlite-utils/releases/tag/3.31
node_id: RE_kwDOCGYnMM4GGJPV
tag_name: 3.31
target_commitish: main
name: 3.31
created_at: 2023-05-08T22:33:57Z
published_at: 2023-05-08T22:37:24Z
updated_at: 2023-05-09T21:08:43Z
body:
  - Dropped support for Python 3.6. Tests now ensure compatibility with Python 3.11. ([#517](https://github.com/simonw/sqlite-utils/issues/517))
  - Automatically locates the SpatiaLite extension on Apple Silicon. Thanks, Chris Amico. ([#536](https://github.com/simonw/sqlite-utils/pull/536))
  - New `--raw-lines` option for the `sqlite-utils query` and `sqlite-utils memory` commands, which outputs just the raw value of the first column of evy row. ([#539](https://github.com/simonw/sqlite-utils/issues/539))
  - Fixed a bug where `table.upsert_all()` failed if the `not_null=` option was passed. ([#538](https://github.com/simonw/sqlite-utils/issues/538))
  - Fixed a `ResourceWarning` when using `sqlite-utils insert`. ([#534](https://github.com/simonw/sqlite-utils/issues/534))
  - Now shows a more detailed error message when `sqlite-utils insert` is called with invalid JSON. ([#532](https://github.com/simonw/sqlite-utils/ises/532))
  - `table.convert(..., skip_false=False)` and `sqlite-utils convert --no-skip-false` options, for avoiding a misfeature where the [convert()](http://127.0.0.1:8000/python-api.html#python-api-convert) mechanism skips rows in the database with a falsey value for the specified column. Fixing this by default would be a backwards-incompatible change and is under consideration for a 4.0 release in the future. ([#527](https://github.com/simonw/sqlite-utils/issues/527))
  - Tables can now be created with self-referential foreign keys. Thanks, Scott Perry. ([#537](https://github.com/simonw/sqlite-utils/pull/537))
  - `sqlite-utils transform` no longer breaks if a table defines default values for columns. Thanks, Kenny Song. ([#509](https://github.com/simonw/sqlite-utils/issues/509))
  - Fixed a bug where repeated calls to `table.transform()` did not work correctly. Thanks, Martin Carpenter. ([#525](https://github.com/simonw/sqlite-utils/issues/525))
  - Improved error message if `rows_from_file()` is passed a non-binary-mode file-like object. ([#520](https://github.com/simonw/sqlite-utils/issues/520))

reactions:
  {"url": "https://api.github.com/repos/simonw/sqlite-utils/releases/102274005/reactions", "total_count": 3, "+1": 3, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/llm/releases/tag/0.3
node_id: RE_kwDOJRhX7M4GKXli
tag_name: 0.3
target_commitish: main
name: 0.3
created_at: 2023-05-17T21:10:18Z
published_at: 2023-05-17T21:13:41Z
updated_at: 2023-05-17T21:13:41Z
body:
  - `llm logs` command for browsing logs of previously executed completions. [#3](https://github.com/simonw/llm/issues/3)
  - `llm "Python code to output factorial 10" --code` option which sets a system prompt designed to encourage code to be output without any additional explanatory text. [#5](https://github.com/simonw/llm/issues/5)
  - Tool can now accept a prompt piped directly to standard input. [#11](https://github.com/simonw/llm/issues/11)


html_url: https://github.com/simonw/strip-tags/releases/tag/0.1
node_id: RE_kwDOJksOk84GKwtA
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2023-05-18T16:08:01Z
published_at: 2023-05-18T16:11:49Z
body:
  - Initial release. Pipe content into this tool to strip HTML tags from it - or specify CSS selectors with `-s selector` to target a subset of the document. [#1](https://github.com/simonw/strip-tags/issues/1)


html_url: https://github.com/simonw/strip-tags/releases/tag/0.2
node_id: RE_kwDOJksOk84GKxHD
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2023-05-18T16:25:13Z
published_at: 2023-05-18T16:26:05Z
body:
  - Design change: tool now accepts CSS selectors as optional arguments, input file can be specified using the new `-i/--input` option. [#3](https://github.com/simonw/strip-tags/issues/3)


html_url: https://github.com/simonw/ttok/releases/tag/0.1
node_id: RE_kwDOJkvrZc4GK3Rp
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2023-05-18T19:53:02Z
published_at: 2023-05-18T19:53:41Z
body:
  - Initial release. `echo input.txt | ttok` to count tokens, use `-t 100` to truncate to 100 tokens, or `--tokens` to see what those integer tokens would be. [#1](https://github.com/simonw/ttok/issues/1)


html_url: https://github.com/simonw/strip-tags/releases/tag/0.3
node_id: RE_kwDOJksOk84GLBuV
tag_name: 0.3
target_commitish: main
name: 0.3
created_at: 2023-05-19T05:17:19Z
published_at: 2023-05-19T05:19:16Z
body:
  - Tags with invisible content such as `<script>` and `<style>` are now omitted from the output. [#4](https://github.com/simonw/strip-tags/issues/4)
  - Images are now replaced by the content of their `alt=` attribute, if available. [#5](https://github.com/simonw/strip-tags/issues/5)
  - New `-m/--minify` option for minifying white space in the output. [#6](https://github.com/simonw/strip-tags/issues/6)

reactions:
  {"url": "https://api.github.com/repos/simonw/strip-tags/releases/103553941/reactions", "total_count": 2, "+1": 2, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/sqlite-utils/releases/tag/3.32
node_id: RE_kwDOCGYnMM4GLuOr
tag_name: 3.32
target_commitish: main
name: 3.32
created_at: 2023-05-21T18:53:44Z
published_at: 2023-05-21T18:55:42Z
updated_at: 2023-05-21T18:55:42Z
body:
  - New experimental `sqlite-utils tui` interface for interactively building command-line invocations, powered by [Trogon](https://github.com/Textualize/trogon). This requires an optional dependency, installed using `sqlite-utils install trogon`. There is a screenshot [in the documentation](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-tui). ([#545](https://github.com/simonw/sqlite-utils/issues/545))
  - `sqlite-utils analyze-tables` command ([documentation](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-analyze-tables)) now has a `--common-limit 20` option for changing the number of common/least-common values shown for each column. ([#544](https://github.com/simonw/sqlite-utils/issues/544))
  - `sqlite-utils analyze-tables --no-most` and `--no-least` options for disabling calculation of most-common and least-common values.
  - If a column contains only `null` values, `analyze-tables` will no longer attempt to calculate the most common and least common values for that column. ([#547](https://github.com/simonw/sqlite-utils/issues/547))
  - Calling `sqlite-utils analyze-tables` with non-existent columns in the `-c/--column` option now results in an error message. ([#548](https://github.com/simonw/sqlite-utils/issues/548))
  - The `table.analyze_column()` method ([documented here](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-analyze-column)) now accepts `most_common=False` and `least_common=False` options for disabling calculation of those values.

reactions:
  {"url": "https://api.github.com/repos/simonw/sqlite-utils/releases/103736235/reactions", "total_count": 3, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 3, "eyes": 0}


html_url: https://github.com/simonw/sqlite-utils/releases/tag/3.32.1
node_id: RE_kwDOCGYnMM4GLvJt
tag_name: 3.32.1
target_commitish: main
name: 3.32.1
created_at: 2023-05-21T21:11:54Z
published_at: 2023-05-21T21:12:05Z
updated_at: 2023-05-21T21:12:05Z
body:
  - Examples in the [CLI documentation](https://sqlite-utils.datasette.io/en/stable/cli.html) can now all be copied and pasted without needing to remove a leading `$`. ([#551](https://github.com/simonw/sqlite-utils/issues/551))
  - Documentation now covers [Setting up shell completion](https://sqlite-utils.datasette.io/en/stable//installation.html#installation-completion) for `bash` and `zsh`. ([#552](https://github.com/simonw/sqlite-utils/issues/552))

reactions:
  {"url": "https://api.github.com/repos/simonw/sqlite-utils/releases/103740013/reactions", "total_count": 3, "+1": 3, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/asg017/sqlite-vss/releases/tag/v0.1.1-alpha.8
node_id: RE_kwDOIt2TLc4GOgIA
tag_name: v0.1.1-alpha.8
target_commitish: main
name: v0.1.1-alpha.8
created_at: 2023-05-26T23:26:31Z
published_at: 2023-05-26T23:29:14Z
reactions:
  {"url": "https://api.github.com/repos/asg017/sqlite-vss/releases/104464896/reactions", "total_count": 1, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 1, "rocket": 0, "eyes": 0}


html_url: https://github.com/asg017/sqlite-vss/releases/tag/v0.1.1-alpha.11
node_id: RE_kwDOIt2TLc4GRqIY
tag_name: v0.1.1-alpha.11
target_commitish: main
name: v0.1.1-alpha.11
created_at: 2023-05-30T01:33:08Z
published_at: 2023-05-30T01:33:30Z
reactions:
  {"url": "https://api.github.com/repos/asg017/sqlite-vss/releases/105292312/reactions", "total_count": 1, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 1, "eyes": 0}


html_url: https://github.com/simonw/datasette-render-images/releases/tag/0.4
node_id: RE_kwDOCKvlRc4GeciK
tag_name: 0.4
target_commitish: main
name: 0.4
created_at: 2023-06-14T21:34:31Z
published_at: 2023-06-14T21:36:06Z
body:
  - Fixed error with recent versions of Jinja. [#12](https://github.com/simonw/datasette-render-images/issues/12)
  - Fixed deprecation warning concerning `imghdr` in Python 3.13. [#14](https://github.com/simonw/datasette-render-images/issues/14)


html_url: https://github.com/simonw/llm/releases/tag/0.4
node_id: RE_kwDOJRhX7M4GfqBP
tag_name: 0.4
target_commitish: main
name: 0.4
created_at: 2023-06-17T08:44:06Z
published_at: 2023-06-17T08:46:05Z
updated_at: 2023-06-18T08:51:58Z
body:
  This release includes some backwards-incompatible changes:

  - The `-4` option for GPT-4 is now `-m 4`.
  - The `--code` option has been removed.
  - The `-s` option has been removed as streaming is now the default. Use `--no-stream` to opt out of streaming.

  ### Prompt templates

  [Prompt templates](https://llm.datasette.io/en/stable/templates.html#prompt-templates) is a new feature that allows prompts to be saved as templates and re-used with different variables.

  Templates can be created using the `llm templates edit` command:

  ```bash
  llm templates edit summarize
  ```
  Templates are YAML - the following template defines summarization using a system prompt:

  ```yaml
  system: Summarize this text
  ```
  The template can then be executed like this:
  ```bash
  cat myfile.txt | llm -t summarize
  ```
  Templates can include both system prompts, regular prompts and indicate the model they should use. They can reference variables such as `$input` for content piped to the tool, or other variables that are passed using the new `-p/--param` option.

  This example adds a `voice` parameter:

  ```yaml
  system: Summarize this text in the voice of $voice
  ```
  Then to run it (via [strip-tags](https://github.com/simonw/strip-tags) to remove HTML tags from the input):
  ```bash
  curl -s 'https://til.simonwillison.net/macos/imovie-slides-and-audio' | \
    strip-tags -m | llm -t summarize -p voice GlaDOS
  ```
  Example output:

  > My previous test subject seemed to have learned something new about iMovie. They exported keynote slides as individual images [...] Quite impressive for a human.

  The [Prompt templates](https://llm.datasette.io/en/stable/templates.html) documentation provides more detailed examples.

  ### Continue previous chat

  You can now use `llm` to continue a previous conversation with the OpenAI chat models (`gpt-3.5-turbo` and `gpt-4`). This will include your previous prompts and responses in the prompt sent to the API, allowing the model to continue within the same context.

  Use the new `-c/--continue` option to continue from the previous message thread:

  ```bash
  llm "Pretend to be a witty gerbil, say hi briefly"
  ```
  > Greetings, dear human! I am a clever gerbil, ready to entertain you with my quick wit and endless energy.
  ```bash
  llm "What do you think of snacks?" -c
  ```
  > Oh, how I adore snacks, dear human! Crunchy carrot sticks, sweet apple slices, and chewy yogurt drops are some of my favorite treats. I could nibble on them all day long!

  The `-c` option will continue from the most recent logged message.

  To continue a different chat, pass an integer ID to the `--chat` option. This should be the ID of a previously logged message. You can find these IDs using the `llm logs` command.

  Thanks [Amjith Ramanujam](https://github.com/amjith) for contributing to this feature. [#6](https://github.com/simonw/llm/issues/6)

  ### New mechanism for storing API keys

  API keys for language models such as those by OpenAI can now be saved using the new `llm keys` family of commands.

  To set the default key to be used for the OpenAI APIs, run this:

  ```bash
  llm keys set openai
  ```
  Then paste in your API key.

  Keys can also be passed using the new `--key` command line option - this can be a full key or the alias of a key that has been previously stored.

  See link-to-docs for more. [#13](https://github.com/simonw/llm/issues/13)

  ### New location for the logs.db database

  The `logs.db` database that stores a history of executed prompts no longer lives at `~/.llm/log.db` - it can now be found in a location that better fits the host operating system, which can be seen using:

  ```bash
  llm logs path
  ```
  On macOS this is `~/Library/Application Support/io.datasette.llm/logs.db`.

  To open that database using Datasette, run this:

  ```bash
  datasette "$(llm logs path)"
  ```
  You can upgrade your existing installation by copying your database to the new location like this:
  ```bash
  cp ~/.llm/log.db "$(llm logs path)"
  rm -rf ~/.llm # To tidy up the now obsolete directory
  ```
  The database schema has changed, and will be updated automatically the first time you run the command.

  That schema is [included in the documentation](https://llm.datasette.io/en/stable/logging.html#sql-schema). [#35](https://github.com/simonw/llm/issues/35)

  ### Other changes

  - New `llm logs --truncate` option (shortcut `-t`) which truncates the displayed prompts to make the log output easier to read. [#16](https://github.com/simonw/llm/issues/16)
  - Documentation now spans multiple pages and lives at <https://llm.datasette.io/> [#21](https://github.com/simonw/llm/issues/21)
  - Default `llm chatgpt` command has been renamed to `llm prompt`. [#17](https://github.com/simonw/llm/issues/17)
  - Removed `--code` option in favour of new prompt templates mechanism. [#24](https://github.com/simonw/llm/issues/24)
  - Responses are now streamed by default, if the model supports streaming. The `-s/--stream` option has been removed. A new `--no-stream` option can be used to opt-out of streaming.  [#25](https://github.com/simonw/llm/issues/25)
  - The `-4/--gpt4` option has been removed in favour of `-m 4` or `-m gpt4`, using a new mechanism that allows models to have additional short names.
  - The new `gpt-3.5-turbo-16k` model with a 16,000 token context length can now also be accessed using `-m chatgpt-16k` or `-m 3.5-16k`. Thanks, Benjamin Kirkbride. [#37](https://github.com/simonw/llm/issues/37)
  - Improved display of error messages from OpenAI. [#15](https://github.com/simonw/llm/issues/15)


html_url: https://github.com/simonw/llm/releases/tag/0.4.1
node_id: RE_kwDOJRhX7M4GfvF9
tag_name: 0.4.1
target_commitish: 0.4x
name: 0.4.1
created_at: 2023-06-17T21:39:20Z
published_at: 2023-06-17T21:40:32Z
updated_at: 2023-06-17T21:40:32Z
body:
  - LLM can now be installed using Homebrew: `brew install simonw/llm/llm`. [#50](https://github.com/simonw/llm/issues/50)
  - `llm` is now styled LLM in the documentation. [#45](https://github.com/simonw/llm/issues/45)
  - Examples in documentation now include a copy button. [#43](https://github.com/simonw/llm/issues/43)
  - `llm templates` command no longer has its display disrupted by newlines. [#42](https://github.com/simonw/llm/issues/42)
  - `llm templates` command now includes system prompt, if set. [#44](https://github.com/simonw/llm/issues/44)


html_url: https://github.com/simonw/strip-tags/releases/tag/0.4
node_id: RE_kwDOJksOk84GfzId
tag_name: 0.4
target_commitish: main
name: 0.4
created_at: 2023-06-18T08:04:41Z
published_at: 2023-06-18T08:08:09Z
body:
  - This package can now be used as a Python library: `from strip_tags import strip_tags`. Thanks, Benjamin Kirkbride. [#9](https://github.com/simonw/strip-tags/issues/9)
  - Text inside `<pre>` elements will no longer have its whitespace modified by `--minify`. [#12](https://github.com/simonw/strip-tags/issues/12)
  - `strip-tags article --first` will now return content from just the first element matching the `article` selector. [#13](https://github.com/simonw/strip-tags/issues/13)
  - `-t/--keep-tag` can be used to specify tags that should have their markup preserved in the output. `-t hs` and `-t structure` and `-t metadata` can be used as shortcuts to specify a bundle of tags at once. [#14](https://github.com/simonw/strip-tags/issues/14)


html_url: https://github.com/simonw/strip-tags/releases/tag/0.4.1
node_id: RE_kwDOJksOk84GfzUD
tag_name: 0.4.1
target_commitish: main
name: 0.4.1
created_at: 2023-06-18T08:37:24Z
published_at: 2023-06-18T08:38:26Z
body:
  - Fixed bug where `strip-tags -t pre` failed to keep the `<pre>` tag markup.
  - Better Python library example code.


html_url: https://github.com/simonw/sqlite-utils/releases/tag/3.33
node_id: RE_kwDOCGYnMM4GjAUh
tag_name: 3.33
target_commitish: main
name: 3.33
created_at: 2023-06-26T01:31:22Z
published_at: 2023-06-26T01:32:30Z
updated_at: 2023-06-26T01:32:30Z
body:
  - `sqlite-utils` will now use [sqlean.py](https://github.com/nalgeon/sqlean.py) in place of `sqlite3` if it is installed in the same virtual environment. This is useful for Python environments with either an outdated version of SQLite or with restrictions on SQLite such as disabled extension loading or restrictions resulting in the `sqlite3.OperationalError: table sqlite_master may not be modified` error. ([#559](https://github.com/simonw/sqlite-utils/issues/559))
  - New `with db.ensure_autocommit_off()` context manager, which ensures that the database is in autocommit mode for the duration of a block of code. This is used by `db.enable_wal()` and `db.disable_wal()` to ensure they work correctly with `pysqlite3` and `sqlean.py`.
  - New `db.iterdump()` method, providing an iterator over SQL strings representing a dump of the database. This uses `sqlite-dump` if it is available, otherwise falling back on the `conn.iterdump()` method from `sqlite3`. Both `pysqlite3` and `sqlean.py` omit support for `iterdump()` - this method helps paper over that difference.

reactions:
  {"url": "https://api.github.com/repos/simonw/sqlite-utils/releases/109839649/reactions", "total_count": 1, "+1": 1, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/strip-tags/releases/tag/0.5
node_id: RE_kwDOJksOk84GkFZt
tag_name: 0.5
target_commitish: main
name: 0.5
created_at: 2023-06-27T20:25:53Z
published_at: 2023-06-27T20:28:04Z
body:
  - New bundles for keeping tags: `-t tables` keeps table tags, `-t lists` keeps list tags. [#18](https://github.com/simonw/strip-tags/issues/18)
  - `strip-tags -r/--remove` option for entirely removing the content of specified selectors. [#24](https://github.com/simonw/strip-tags/issues/24)
  - Fixed a bug where `<!-- comment -->` text was incorrectly included in the stripped output. [#25](https://github.com/simonw/strip-tags/issues/25)

reactions:
  {"url": "https://api.github.com/repos/simonw/strip-tags/releases/110122605/reactions", "total_count": 1, "+1": 1, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/datasette-upload-csvs/releases/tag/0.8.3
node_id: RE_kwDODf8oPs4GkKQ2
tag_name: 0.8.3
target_commitish: main
name: 0.8.3
created_at: 2023-06-28T01:24:06Z
published_at: 2023-06-28T01:25:33Z
updated_at: 2023-06-28T01:25:33Z
body:
  - Fixed bug where dragging a file onto the area could result in an error message that was not present when clicking to select a file. Thanks, Alex Garcia. [#32](https://github.com/simonw/datasette-upload-csvs/pull/32)

reactions:
  {"url": "https://api.github.com/repos/simonw/datasette-upload-csvs/releases/110142518/reactions", "total_count": 1, "+1": 1, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/datasette-render-markdown/releases/tag/2.2
node_id: RE_kwDODSffFs4GmhFZ
tag_name: 2.2
target_commitish: main
name: 2.2
created_at: 2023-07-02T00:43:06Z
published_at: 2023-07-02T00:44:39Z
body:
  - New `{% markdown %}...{% endmarkdown %}` Jinja template tag ([documentation here](https://github.com/simonw/datasette-render-markdown/blob/2.2/README.md#markdown-in-templates)) for rendering blocks of Markdown content. This accepts optional attributes for controlling the Markdown renderer, for example `{% markdown extra_attrs="p:id,class a:name,href" %}`. [#14](https://github.com/simonw/datasette-render-markdown/issues/14)

reactions:
  {"url": "https://api.github.com/repos/simonw/datasette-render-markdown/releases/110760281/reactions", "total_count": 1, "+1": 1, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/dogsheep/pocket-to-sqlite/releases/tag/0.2.3
node_id: RE_kwDODLZ_YM4GpZCV
tag_name: 0.2.3
target_commitish: main
name: 0.2.3
created_at: 2023-07-09T01:14:06Z
published_at: 2023-07-09T01:15:03Z
body:
  - Progress bar now includes a count of the total number of items to fetch.
  - Now packaged using `pyproject.toml`. [#12](https://github.com/dogsheep/pocket-to-sqlite/issues/12)


html_url: https://github.com/simonw/strip-tags/releases/tag/0.5.1
node_id: RE_kwDOJksOk84GpgQY
tag_name: 0.5.1
target_commitish: main
name: 0.5.1
created_at: 2023-07-09T21:50:40Z
published_at: 2023-07-09T21:52:16Z
body:
  - Fixed an error when run against files using an encoding other than UTF-8. Thanks, [kmad](https://github.com/kmad). [#7](https://github.com/simonw/strip-tags/issues/7)


html_url: https://github.com/simonw/ttok/releases/tag/0.2
node_id: RE_kwDOJkvrZc4GqLRE
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2023-07-10T23:35:25Z
published_at: 2023-07-10T23:37:29Z
body:
  - `--encode` now encodes text to integer tokens and displays them. This has been renamed from `--tokens`.
  - `--decode` against a sequence of integer tokens now turns those back into text. [#7](https://github.com/simonw/ttok/issues/7)
  - `--tokens` for either of those options outputs the raw tokens in a format that helps show if they have a leading space or similar. [#4](https://github.com/simonw/ttok/issues/4)


html_url: https://github.com/simonw/llm/releases/tag/0.5
node_id: RE_kwDOJRhX7M4GrGW7
tag_name: 0.5
target_commitish: main
name: 0.5
created_at: 2023-07-12T14:22:17Z
published_at: 2023-07-12T14:22:53Z
updated_at: 2023-07-12T14:22:53Z
body:
  LLM now supports **additional language models**, thanks to a new [plugins mechanism](https://llm.datasette.io/en/stable/plugins/installing-plugins.html#installing-plugins) for installing additional models.

  Plugins are available for 19 models in addition to the default OpenAI ones:

  - [llm-gpt4all](https://github.com/simonw/llm-gpt4all) adds support for 17 models that can download and run on your own device, including Vicuna, Falcon and wizardLM.
  - [llm-mpt30b](https://github.com/simonw/llm-mpt30b) adds support for the MPT-30B model, a 19GB download.
  - [llm-palm](https://github.com/simonw/llm-palm) adds support for Google's PaLM 2 via the Google API.

  A comprehensive tutorial, [writing a plugin to support a new model](https://llm.datasette.io/en/stable/plugins/tutorial-model-plugin.html#tutorial-model-plugin) describes how to add new models by building plugins in detail.

  ### New features

  - [Python API](https://llm.datasette.io/en/stable/python-api.html#python-api) documentation for using LLM models, including models from plugins, directly from Python. [#75](https://github.com/simonw/llm/issues/75)
  - Messages are now logged to the database by default - no need to run the `llm init-db` command any more, which has been removed. Instead, you can toggle this behavior off using `llm logs off` or turn it on again using `llm logs on`. The `llm logs status` command shows the current status of the log database. If logging is turned off, passing `--log` to the `llm prompt` command will cause that prompt to be logged anyway. [#98](https://github.com/simonw/llm/issues/98)
  - New database schema for logged messages, with `conversations` and `responses` tables. If you have previously used the old `logs` table it will continue to exist but will no longer be written to. [#91](https://github.com/simonw/llm/issues/91)
  - New `-o/--option name value` syntax for setting options for models, such as temperature. Available options differ for different models. [#63](https://github.com/simonw/llm/issues/63)
  - `llm models list --options` command for viewing all available model options. [#82](https://github.com/simonw/llm/issues/82)
  - `llm "prompt" --save template` option for saving a prompt directly to a template. [#55](https://github.com/simonw/llm/issues/55)
  - Prompt templates can now specify [default values](https://llm.datasette.io/en/stable/templates.html#prompt-default-parameters) for parameters. Thanks, Chris Mungall. [#57](https://github.com/simonw/llm/pull/57)
  - `llm openai models` command to list all available OpenAI models from their API. [#70](https://github.com/simonw/llm/issues/70)
  - `llm models default MODEL_ID` to set a different model as the default to be used when `llm` is run without the `-m/--model` option. [#31](https://github.com/simonw/llm/issues/31)

  ### Smaller improvements

  - `llm -s` is now a shortcut for `llm --system`. [#69](https://github.com/simonw/llm/issues/69)
  - `llm -m 4-32k` alias for `gpt-4-32k`.
  - `llm install -e directory` command for installing a plugin from a local directory.
  - The `LLM_USER_PATH` environment variable now controls the location of the directory in which LLM stores its data. This replaces the old `LLM_KEYS_PATH` and `LLM_LOG_PATH` and `LLM_TEMPLATES_PATH` variables. [#76](https://github.com/simonw/llm/issues/76)
  - Documentation covering [Utility functions for plugins](https://llm.datasette.io/en/stable/plugins/plugin-utilities.html#plugin-utilities).
  - Documentation site now uses Plausible for analytics. [#79](https://github.com/simonw/llm/issues/79)

reactions:
  {"url": "https://api.github.com/repos/simonw/llm/releases/111961531/reactions", "total_count": 1, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 1}


html_url: https://github.com/simonw/datasette-auth-tokens/releases/tag/0.4a0
node_id: RE_kwDOEDFIuM4GtWsM
tag_name: 0.4a0
target_commitish: main
name: 0.4a0
created_at: 2023-07-17T19:10:43Z
published_at: 2023-07-17T19:11:58Z
updated_at: 2023-07-17T19:11:58Z
body:
  - Alpha release, with first preview of the new manage tokens mode. This provides a table for database-backed API tokens and an interface for creating and revoking them. [#7](https://github.com/simonw/datasette-auth-tokens/issues/7)

reactions:
  {"url": "https://api.github.com/repos/simonw/datasette-auth-tokens/releases/112552716/reactions", "total_count": 1, "+1": 1, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/asg017/sqlite-vss/releases/tag/v0.1.1-alpha.21
node_id: RE_kwDOIt2TLc4GtfGM
tag_name: v0.1.1-alpha.21
target_commitish: main
name: v0.1.1-alpha.21
created_at: 2023-07-18T02:30:09Z
published_at: 2023-07-18T02:30:57Z
reactions:
  {"url": "https://api.github.com/repos/asg017/sqlite-vss/releases/112587148/reactions", "total_count": 1, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 1, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/llm/releases/tag/0.6
node_id: RE_kwDOJRhX7M4GuCp0
tag_name: 0.6
target_commitish: main
name: 0.6
created_at: 2023-07-18T21:36:37Z
published_at: 2023-07-18T21:38:10Z
updated_at: 2023-07-18T21:38:10Z
body:
  - Models hosted on [Replicate](https://replicate.com/) can now be accessed using the [llm-replicate](https://github.com/simonw/llm-replicate) plugin, including the new Llama 2 model from Meta AI. More details here: [Accessing Llama 2 from the command-line with the llm-replicate plugin](https://simonwillison.net/2023/Jul/18/accessing-llama-2/).
  - Model providers that expose an API that is compatible with the OpenAPI API format, including self-hosted model servers such as [LocalAI](https://github.com/go-skynet/LocalAI), can now be accessed using [additional configuration](https://llm.datasette.io/en/stable/other-models.html#openai-compatible-models) for the default OpenAI plugin. [#106](https://github.com/simonw/llm/issues/106)
  - OpenAI models that are not yet supported by LLM can also be configured <openai-extra-models>} using the new extra-openai-models.yaml` configuration file. [#107](https://github.com/simonw/llm/issues/107)
  - The [llm logs command](https://llm.datasette.io/en/stable/logging.html#viewing-logs) now accepts a `-m model_id` option to filter logs to a specific model. Aliases can be used here in addition to model IDs. [#108](https://github.com/simonw/llm/issues/108)
  - Logs now have a SQLite full-text search index against their prompts and responses, and the `llm logs -q SEARCH` option can be used to return logs that match a search term. [#109](https://github.com/simonw/llm/issues/109)


html_url: https://github.com/asg017/sqlite-vss/releases/tag/v0.1.1
node_id: RE_kwDOIt2TLc4GvBah
tag_name: v0.1.1
target_commitish: main
name: v0.1.1
created_at: 2023-07-20T15:31:37Z
published_at: 2023-07-20T15:35:19Z
body:
  Check out the [`sqlite-vss` v0.1.1 Annotated Release Notes](https://observablehq.com/@asg017/sqlite-vss-v0-1-1-annotated-release-notes) for more information. 


  ## Added

  - Experimental Elixir bindings. Thanks to @trodrigu for contributing!
  - Experimental Ruby bindings
  - Experimental Go bindings
  - Experimental Rust bindings
  - A new `metric_type=` argument to `vss0` column definition, to configure which distance algorithm to use. Thanks to @dleviminzi for contributing!
  - A new `vss_cosine_similarity()` function. Thanks to @dleviminzi for contributing!

  ## Fixed
  - Multiple memory leaks and related memory management issues. Big thanks to @polterguy for their hard work on this!
  - A bug when inserting and deleting vss0 rows in the same transactions, like with UPSERT-like statements.
  - Querying vector columns in `vss0` tables now return the BLOB representation of that vector, instead of NULL.

  ## Thanks

  Thank you all for your contributions that make up this release!

  @mattvr @Miserlou @penberg @linonetwo @learning4life @mattn @trodrigu @gworkman @tgfjt @polterguy @dleviminzi 

reactions:
  {"url": "https://api.github.com/repos/asg017/sqlite-vss/releases/112989857/reactions", "total_count": 3, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 3, "eyes": 0}


html_url: https://github.com/simonw/sqlite-utils/releases/tag/3.34
node_id: RE_kwDOCGYnMM4Gv1hY
tag_name: 3.34
target_commitish: main
name: 3.34
created_at: 2023-07-22T23:25:14Z
published_at: 2023-07-22T23:30:49Z
updated_at: 2023-07-22T23:30:49Z
body:
  This release introduces a new [plugin system](https://sqlite-utils.datasette.io/en/stable/plugins.html#plugins). ([#567](https://github.com/simonw/sqlite-utils/issues/567))

  -   Documentation describing [how to build a plugin](https://sqlite-utils.datasette.io/en/stable/plugins.html#plugins-building).
  -   Plugin hook: [register_commands(cli)](https://sqlite-utils.datasette.io/en/stable/plugins.html#plugins-hooks-register-commands), for plugins to add extra commands to `sqlite-utils`. ([#569](https://github.com/simonw/sqlite-utils/issues/569))
  -   Plugin hook: [prepare_connection(conn)](https://sqlite-utils.datasette.io/en/stable/plugins.html#plugins-hooks-prepare-connection). Plugins can use this to help prepare the SQLite connection to do things like registering custom SQL functions. Thanks, [Alex Garcia](https://github.com/asg017). ([#574](https://github.com/simonw/sqlite-utils/issues/574))
  -   `sqlite_utils.Database(..., execute_plugins=False)` option for disabling plugin execution. ([#575](https://github.com/simonw/sqlite-utils/issues/575))
  - `sqlite-utils install -e path-to-directory` option for installing editable code. This option is useful during the development of a plugin. ([#570](https://github.com/simonw/sqlite-utils/issues/570))
  - `table.create(...)` method now accepts `replace=True` to drop and replace an existing table with the same name, or `ignore=True` to silently do nothing if a table already exists with the same name. ([#568](https://github.com/simonw/sqlite-utils/issues/568))
  - `sqlite-utils insert ... --stop-after 10` option for stopping the insert after a specified number of records. Works for the `upsert` command as well. ([#561](https://github.com/simonw/sqlite-utils/issues/561))
  - The `--csv` and `--tsv` modes for `insert` now accept a `--empty-null` option, which cases empty strings in the CSV file to be stored as `null` in the database. ([#563](https://github.com/simonw/sqlite-utils/issues/563))
  - New `db.rename_table(table_name, new_name)` method for renaming tables. ([#565](https://github.com/simonw/sqlite-utils/issues/565))
  - `sqlite-utils rename-table my.db table_name new_name` command for renaming tables. ([#565](https://github.com/simonw/sqlite-utils/issues/565))
  - The `table.transform(...)` method now takes an optional `keep_table=new_table_name` parameter, which will cause the original table to be renamed to `new_table_name` rather than being dropped at the end of the transformation. ([#571](https://github.com/simonw/sqlite-utils/issues/571))
  - Documentation now notes that calling `table.transform()` without any arguments will reformat the SQL schema stored by SQLite to be more aesthetically pleasing. ([#564](https://github.com/simonw/sqlite-utils/issues/564))

reactions:
  {"url": "https://api.github.com/repos/simonw/sqlite-utils/releases/113203288/reactions", "total_count": 2, "+1": 2, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/asg017/sqlite-path/releases/tag/v0.2.0
node_id: RE_kwDOHwJJsc4GwEaI
tag_name: v0.2.0
target_commitish: main
name: v0.2.0
created_at: 2023-07-24T06:01:14Z
published_at: 2023-07-24T06:01:33Z
body:
  - Added a new `path_length()` scalar function, which returns the number of 'segments' in a given path.
  - Added bindings to a new [`sqlite-utils` plugin](https://sqlite-utils.datasette.io/en/stable/plugins.html). You can install it with `sqlite-utils install sqlite-utils-sqlite-path`.
  - Added Deno bindings. See [`deno.land/x/sqlite_path`](https://deno.land/x/sqlite_path) for more info.
  - Added Node bindings. See [`sqlite-path`](https://www.npmjs.com/package/sqlite-path) for more info.
  - Added Ruby bindings. See [sqlite-path`](https://rubygems.org/gems/sqlite-path) for more info.


html_url: https://github.com/asg017/sqlite-lines/releases/tag/v0.2.0
node_id: RE_kwDOHPAsus4GwEfX
tag_name: v0.2.0
target_commitish: main
name: v0.2.0
created_at: 2023-07-24T06:06:17Z
published_at: 2023-07-24T06:06:34Z
body:
  - Added new `sqlite3_lines_no_read_init` entrypoint that does not register the `lines_read()` table function. 
  - Added bindings to a new [`sqlite-utils` plugin](https://sqlite-utils.datasette.io/en/stable/plugins.html). You can install it with `sqlite-utils install sqlite-utils-sqlite-lines`.
  - Added Deno bindings. See [`deno.land/x/sqlite_lines`](https://deno.land/x/sqlite_lines) for more info.
  - Added Node bindings. See [`sqlite-lines`](https://www.npmjs.com/package/sqlite-lines) for more info.
  - Added Ruby bindings. See [sqlite-lines`](https://rubygems.org/gems/sqlite-lines) for more info.


html_url: https://github.com/asg017/sqlite-ulid/releases/tag/v0.2.1
node_id: RE_kwDOIpo-2s4GwEhW
tag_name: v0.2.1
target_commitish: main
name: v0.2.1
created_at: 2023-07-24T06:07:17Z
published_at: 2023-07-24T06:07:33Z
body:
  - Added new `ulid_with_datetime()` scalar function, which allows for creating a ULID from a pre-determined timestamp. Thanks @chesedo  for the contribution!
  - Added bindings to a new [`sqlite-utils` plugin](https://sqlite-utils.datasette.io/en/stable/plugins.html). You can install it with `sqlite-utils install sqlite-utils-sqlite-ulid`.
  - Added Deno bindings. See [`deno.land/x/sqlite_ulid`](https://deno.land/x/sqlite_ulid) for more info.
  - Added Node bindings. See [`sqlite-ulid`](https://www.npmjs.com/package/sqlite-ulid) for more info.
  - Added Ruby bindings. See [sqlite-ulid`](https://rubygems.org/gems/sqlite-ulid) for more info.
  - Experimental Go bindings.


html_url: https://github.com/asg017/sqlite-url/releases/tag/v0.1.0
node_id: RE_kwDOHwJOSc4GwEiy
tag_name: v0.1.0
target_commitish: main
name: v0.1.0
created_at: 2023-07-24T06:07:52Z
published_at: 2023-07-24T06:08:46Z
body:
  - Added bindings to a new [`sqlite-utils` plugin](https://sqlite-utils.datasette.io/en/stable/plugins.html). You can install it with `sqlite-utils install sqlite-utils-sqlite-url`.
  - Added Deno bindings. See [`deno.land/x/sqlite_url`](https://deno.land/x/sqlite_url) for more info.
  - Added Node bindings. See [`sqlite-url`](https://www.npmjs.com/package/sqlite-url) for more info.
  - Added Ruby bindings. See [sqlite-url`](https://rubygems.org/gems/sqlite-url) for more info.


html_url: https://github.com/asg017/sqlite-regex/releases/tag/v0.2.3
node_id: RE_kwDOIX3Uzc4GwEkb
tag_name: v0.2.3
target_commitish: main
name: v0.2.3
created_at: 2023-07-24T06:09:36Z
published_at: 2023-07-24T06:09:53Z
body:
  - Added new `regex_capture()` scalar function, which allows you to extract a named or unnamed capture group from a match.
  - Added a new `regex_captures()` table function, which allows you to interate over every capture group in a match.
  - Added bindings to a new [`sqlite-utils` plugin](https://sqlite-utils.datasette.io/en/stable/plugins.html). You can install it with `sqlite-utils install sqlite-utils-sqlite-regex`.
  - Added Deno bindings. See [`deno.land/x/sqlite_regex`](https://deno.land/x/sqlite_regex) for more info.
  - Added Node bindings. See [`sqlite-regex`](https://www.npmjs.com/package/sqlite-regex) for more info.
  - Added Ruby bindings. See [sqlite-regex`](https://rubygems.org/gems/sqlite-regex) for more info.
  - Added `sqlite-regex` to crates.io for easier Rust bindings. 


html_url: https://github.com/simonw/llm/releases/tag/0.6.1
node_id: RE_kwDOJRhX7M4GwYgh
tag_name: 0.6.1
target_commitish: main
name: 0.6.1
created_at: 2023-07-24T15:53:48Z
published_at: 2023-07-24T15:55:08Z
updated_at: 2023-07-24T15:55:08Z
body:
  - LLM can now be installed directly from Homebrew core: `brew install llm`. [#124](https://github.com/simonw/llm/issues/124)
  - Python API documentation now covers [System prompts](https://llm.datasette.io/en/stable/python-api.html#system-prompts).
  - Fixed incorrect example in the [Prompt templates](https://llm.datasette.io/en/stable/templates.html#prompt-templates) documentation. Thanks, Jorge Cabello. [#125](https://github.com/simonw/llm/pull/125)


html_url: https://github.com/simonw/datasette-upload-dbs/releases/tag/0.2
node_id: RE_kwDOHSfuMs4G1f2_
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2023-08-01T17:12:15Z
published_at: 2023-08-01T17:12:59Z
updated_at: 2023-08-01T17:12:59Z
body:
  - New `skip_startup_scan` configuration option for avoiding loading DBs in the directory on startup. [#8](https://github.com/simonw/datasette-upload-dbs/issues/8)


html_url: https://github.com/asg017/sqlite-http/releases/tag/v0.1.0
node_id: RE_kwDOGM0Pt84G3fsD
tag_name: v0.1.0
target_commitish: main
name: v0.1.0
created_at: 2023-08-05T01:42:44Z
published_at: 2023-08-05T01:44:06Z
body:
  Various distribution upgrades! You can now install `sqlite-http` with:

  - Python / `pip`
  - Node.js / `npm`
  - Ruby / `gem`
  - Deno
  - Datasette Plugin

  Additional, Mac M1 arm64 builds are now supported.


html_url: https://github.com/asg017/sqlite-jsonschema/releases/tag/v0.2.3
node_id: RE_kwDOIX3aMs4G4A-s
tag_name: v0.2.3
target_commitish: main
name: v0.2.3
created_at: 2023-08-06T00:29:43Z
published_at: 2023-08-06T00:30:34Z
body:
  - New `sqlite-utils` plugin - try with `sqlite-utils install sqlite-utils-sqlite-jsonschema`
  - Various small fixes


html_url: https://github.com/asg017/sqlite-fastrand/releases/tag/v0.2.1
node_id: RE_kwDOIu6Scs4G4A_c
tag_name: v0.2.1
target_commitish: main
name: v0.2.1
created_at: 2023-08-06T00:31:29Z
published_at: 2023-08-06T00:32:19Z
body:
  - New `sqlite-utils` plugin. Try with `sqlite-utils install sqlite-utils-sqlite-fastrand`
  - Various new bindings


html_url: https://github.com/asg017/sqlite-vss/releases/tag/v0.1.2
node_id: RE_kwDOIt2TLc4G4CZc
tag_name: v0.1.2
target_commitish: main
name: v0.1.2
created_at: 2023-08-06T02:25:15Z
published_at: 2023-08-06T02:26:05Z
body:
  - small fix for macos arm builds in Python wheels.
  - Adds new `sqlite-utils` plugin. Try it with `sqlite-utils install sqlite-utils-sqlite-vss`

reactions:
  {"url": "https://api.github.com/repos/asg017/sqlite-vss/releases/115353180/reactions", "total_count": 2, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 2, "eyes": 0}


html_url: https://github.com/simonw/datasette/releases/tag/1.0a3
node_id: RE_kwDOBm6k_c4G5y2Y
tag_name: 1.0a3
target_commitish: main
name: 1.0a3
created_at: 2023-08-09T19:13:11Z
published_at: 2023-08-09T19:17:26Z
updated_at: 2023-08-09T19:17:26Z
body:
  This alpha release previews the updated design for Datasette's default JSON API. ([#782](https://github.com/simonw/datasette/issues/782))

  The new [default JSON representation](https://docs.datasette.io/en/1.0a3/json_api.html#json-api-default) for both table pages (`/dbname/table.json`) and arbitrary SQL queries (`/dbname.json?sql=...`) is now shaped like this:
  ```json
  {
    "ok": true,
    "rows": [
      {
        "id": 3,
        "name": "Detroit"
      },
      {
        "id": 2,
        "name": "Los Angeles"
      },
      {
        "id": 4,
        "name": "Memnonia"
      },
      {
        "id": 1,
        "name": "San Francisco"
      }
    ],
    "truncated": false
  }
  ```
  Tables will include an additional `"next"` key for pagination, which can be passed to `?_next=` to fetch the next page of results.

  The various `?_shape=` options continue to work as before - see [Different shapes](https://docs.datasette.io/en/1.0a3/json_api.html#json-api-shapes) for details.

  A new `?_extra=` mechanism is available for tables, but has not yet been stabilized or documented. Details on that are available in [#262](https://github.com/simonw/datasette/issues/262).

  ### Smaller changes

  - Datasette documentation now shows YAML examples for [Metadata](https://docs.datasette.io/en/1.0a3/metadata.html#metadata) by default, with a tab interface for switching to JSON. ([#1153](https://github.com/simonw/datasette/issues/1153))
  - [register_output_renderer(datasette)](https://docs.datasette.io/en/1.0a3/plugin_hooks.html#plugin-register-output-renderer) plugins now have access to `error` and `truncated` arguments, allowing them to display error messages and take into account truncated results. ([#2130](https://github.com/simonw/datasette/issues/2130))
  - `render_cell()` plugin hook now also supports an optional `request` argument. ([#2007](https://github.com/simonw/datasette/issues/2007))
  - New `Justfile` to support development workflows for Datasette using [Just](https://github.com/casey/just).
  - `datasette.render_template()` can now accepts a `datasette.views.Context` subclass as an alternative to a dictionary. ([#2127](https://github.com/simonw/datasette/issues/2127))
  - `datasette install -e path` option for editable installations, useful while developing plugins. ([#2106](https://github.com/simonw/datasette/issues/2106))
  - When started with the `--cors` option Datasette now serves an `Access-Control-Max-Age: 3600` header, ensuring CORS OPTIONS requests are repeated no more than once an hour. ([#2079](https://github.com/simonw/datasette/issues/2079))
  - Fixed a bug where the `_internal` database could display `None` instead of `null` for in-memory databases. ([#1970](https://github.com/simonw/datasette/issues/1970))

reactions:
  {"url": "https://api.github.com/repos/simonw/datasette/releases/115813784/reactions", "total_count": 3, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 3, "eyes": 0}


html_url: https://github.com/simonw/datasette-upload-dbs/releases/tag/0.3
node_id: RE_kwDOHSfuMs4G6Xrc
tag_name: 0.3
target_commitish: main
name: 0.3
created_at: 2023-08-10T17:13:43Z
published_at: 2023-08-10T17:15:28Z
updated_at: 2023-08-10T17:15:28Z
body:
  - Now registers the `upload-dbs` permission with the registry system added [in Datasette 1.0a2](https://docs.datasette.io/en/latest/changelog.html#a2-2022-12-14). [#9](https://github.com/simonw/datasette-upload-dbs/issues/9)


html_url: https://github.com/simonw/llm/releases/tag/0.7
node_id: RE_kwDOJRhX7M4G9LmM
tag_name: 0.7
target_commitish: main
name: 0.7
created_at: 2023-08-12T16:40:14Z
published_at: 2023-08-12T16:41:07Z
updated_at: 2023-08-12T17:20:31Z
body:
  The new [Model aliases](https://llm.datasette.io/en/stable/aliases.html) commands can be used to configure additional aliases for models, for example:

  ```bash
  llm aliases set turbo gpt-3.5-turbo-16k
  ```
  Now you can run the 16,000 token `gpt-3.5-turbo-16k` model like this:

  ```bash
  llm -m turbo 'An epic Greek-style saga about a cheesecake that builds a SQL database from scratch'
  ```
  Use `llm aliases list` to see a list of aliases and `llm aliases remove turbo` to remove one again. [#151](https://github.com/simonw/llm/issues/151)

  ### Notable new plugins

  - **[llm-mlc](https://github.com/simonw/llm-mlc)** can run local models released by the [MLC project](https://mlc.ai/mlc-llm/), including models that can take advantage of the GPU on Apple Silicon M1/M2 devices.
  - **[llm-llama-cpp](https://github.com/simonw/llm-llama-cpp)** uses [llama.cpp](https://github.com/ggerganov/llama.cpp) to run models published in the GGML format. See [Run Llama 2 on your own Mac using LLM and Homebrew](https://simonwillison.net/2023/Aug/1/llama-2-mac/) for more details.

  ### Also in this release

  - OpenAI models now have min and max validation on their floating point options. Thanks, Pavel Král. [#115](https://github.com/simonw/llm/issues/115)
  - Fix for bug where `llm templates list` raised an error if a template had an empty prompt. Thanks, Sherwin Daganato. [#132](https://github.com/simonw/llm/pull/132)
  - Fixed bug in `llm install --editable` option which prevented installation of `.[test]`. [#136](https://github.com/simonw/llm/issues/136)
  - `llm install --no-cache-dir` and `--force-reinstall` options. [#146](https://github.com/simonw/llm/issues/146)

reactions:
  {"url": "https://api.github.com/repos/simonw/llm/releases/116701580/reactions", "total_count": 4, "+1": 3, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 1, "eyes": 0}


html_url: https://github.com/simonw/datasette-render-markdown/releases/tag/2.2.1
node_id: RE_kwDODSffFs4G_TOr
tag_name: 2.2.1
target_commitish: main
name: 2.2.1
created_at: 2023-08-15T03:09:45Z
published_at: 2023-08-15T03:10:29Z
body:
  - Fixed a crashing bug when `{{ render_markdown(None) }}` was called in a template. [#15](https://github.com/simonw/datasette-render-markdown/issues/15)


html_url: https://github.com/simonw/openai-to-sqlite/releases/tag/0.4
node_id: RE_kwDOItf8Rs4G_UWp
tag_name: 0.4
target_commitish: main
name: 0.4
created_at: 2023-08-15T04:57:01Z
published_at: 2023-08-15T05:00:16Z
body:
  - Text that is too long to be sent to the embedding model is now truncated to the correct length. [#6](https://github.com/simonw/openai-to-sqlite/issues/6)
  - `openai-to-sqlite similar` command, [documented here](https://github.com/simonw/openai-to-sqlite/blob/0.4/README.md#search-for-similar-content-with-the-similar-command). Thanks,  [Benoit Delbosc](https://github.com/bdelbosc). [#14](https://github.com/simonw/openai-to-sqlite/issues/14)
  - New `--count` option for `openai-to-sqlite search` command. [#13](https://github.com/simonw/openai-to-sqlite/issues/13)
  - Dropped support for Python 3.7 due to new dependency on `tiktoken`.


html_url: https://github.com/simonw/sqlite-utils/releases/tag/3.35
node_id: RE_kwDOCGYnMM4HBALi
tag_name: 3.35
target_commitish: main
name: 3.35
created_at: 2023-08-18T02:05:15Z
published_at: 2023-08-18T02:05:22Z
updated_at: 2023-08-18T17:46:30Z
body:
  Adding foreign keys to a table no longer uses `PRAGMA writable_schema = 1` to directly manipulate the `sqlite_master` table. This was resulting in errors in some Python installations where the SQLite library was compiled in a way that prevented this from working, in particular on macOS. Foreign keys are now added using the [table transformation](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-transform) mechanism instead. ([#577](https://github.com/simonw/sqlite-utils/issues/577))

  This new mechanism creates a full copy of the table, so it is likely to be significantly slower for large tables, but will no longer trigger table `sqlite_master may not be modified` errors on platforms that do not support `PRAGMA writable_schema = 1`.

  A new plugin, [sqlite-utils-fast-fks](https://github.com/simonw/sqlite-utils-fast-fks), is now available for developers who still want to use that faster but riskier implementation.

  Other changes:

  - The [table.transform() method](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-transform) has two new parameters: `foreign_keys=` allows you to replace the foreign key constraints defined on a table, and `add_foreign_keys=` lets you specify new foreign keys to add. These complement the existing `drop_foreign_keys=` parameter. ([#577](https://github.com/simonw/sqlite-utils/issues/577))
  - The [sqlite-utils transform](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-transform-table) command has a new `--add-foreign-key` option which can be called multiple times to add foreign keys to a table that is being transformed. ([#585](https://github.com/simonw/sqlite-utils/issues/585))
  - [sqlite-utils convert](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-convert) now has a `--pdb` option for opening a debugger on the first encountered error in your conversion script. ([#581](https://github.com/simonw/sqlite-utils/issues/581))
  - Fixed a bug where `sqlite-utils install -e '.[test]'` option did not work correctly.

reactions:
  {"url": "https://api.github.com/repos/simonw/sqlite-utils/releases/117703394/reactions", "total_count": 1, "+1": 1, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/datasette-edit-schema/releases/tag/0.5.3
node_id: RE_kwDODsD4Ds4HBDbs
tag_name: 0.5.3
target_commitish: main
name: 0.5.3
created_at: 2023-08-18T06:11:38Z
published_at: 2023-08-18T06:12:09Z
updated_at: 2023-08-18T06:12:09Z
body:
  - Fix for an error that occurs if you try to drop a column from a table that is part of a SQL view. [#35](https://github.com/simonw/datasette-edit-schema/issues/35)


html_url: https://github.com/simonw/llm/releases/tag/0.7.1
node_id: RE_kwDOJRhX7M4HBu4A
tag_name: 0.7.1
target_commitish: 0.7.x
name: 0.7.1
created_at: 2023-08-19T21:07:52Z
published_at: 2023-08-19T21:08:59Z
updated_at: 2023-08-19T21:08:59Z
body:
  - Fixed a bug where some users would see an `AlterError: No such column: log.id` error when attempting to use this tool, after upgrading to the latest [sqlite-utils 3.35 release](https://sqlite-utils.datasette.io/en/stable/changelog.html#v3-35). [#162](https://github.com/simonw/llm/issues/162)

reactions:
  {"url": "https://api.github.com/repos/simonw/llm/releases/117894656/reactions", "total_count": 2, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 2, "eyes": 0}


html_url: https://github.com/simonw/llm/releases/tag/0.8
node_id: RE_kwDOJRhX7M4HB9na
tag_name: 0.8
target_commitish: main
name: 0.8
created_at: 2023-08-21T06:53:09Z
published_at: 2023-08-21T06:55:07Z
updated_at: 2023-08-21T06:55:07Z
body:
  - The output format for `llm logs` has changed. Previously it was JSON - it's now a much more readable Markdown format suitable for pasting into other documents. [#160](https://github.com/simonw/llm/issues/160)
    - The new `llm logs --json` option can be used to get the old JSON format.
    - Pass `llm logs --conversation ID` or `--cid ID` to see the full logs for a specific conversation.
  - You can now combine piped input and a prompt in a single command: `cat script.py | llm 'explain this code'`. This works even for models that do not support [system prompts](https://llm.datasette.io/en/stable/usage.html#system-prompts). [#153](https://github.com/simonw/llm/issues/153)
  - Additional [OpenAI-compatible models](https://llm.datasette.io/en/stable/other-models.html#openai-compatible-models) can now be configured with custom HTTP headers. This enables platforms such as [openrouter.ai](https://openrouter.ai/) to be used with LLM, which can provide Claude access even without an Anthropic API key.
  - Keys set in `keys.json` are now used in preference to environment variables. [#158](https://github.com/simonw/llm/issues/158)
  - The documentation now includes a [plugin directory](https://llm.datasette.io/en/stable/plugins/directory.html#plugin-directory) listing all available plugins for LLM. [#173](https://github.com/simonw/llm/issues/173)
  - New [related tools](https://llm.datasette.io/en/stable/related-tools.html#related-tools) section in the documentation describing `ttok`, `strip-tags` and `symbex`. [#111](https://github.com/simonw/llm/issues/111)
  - The `llm models`, `llm aliases` and `llm templates` commands now default to running the same command as `llm models list` and `llm aliases list` and `llm templates list`. [#167](https://github.com/simonw/llm/issues/167)
  - New `llm keys` (aka `llm keys list`) command for listing the names of all configured keys. [#174](https://github.com/simonw/llm/issues/174)
  - Two new Python API functions, `llm.set_alias(alias, model_id)` and `llm.remove_alias(alias)` can be used to configure aliases from within Python code. [#154](https://github.com/simonw/llm/pull/154)
  - LLM is now compatible with both Pydantic 1 and Pydantic 2. This means you can install `llm` as a Python dependency in a project that depends on Pydantic 1 without running into dependency conflicts. Thanks, [Chris Mungall](https://github.com/cmungall). [#147](https://github.com/simonw/llm/pull/147)
  - `llm.get_model(model_id)` is now documented as raising `llm.UnknownModelError` if the requested model does not exist. [#155](https://github.com/simonw/llm/issues/155)


html_url: https://github.com/simonw/datasette-publish-fly/releases/tag/1.3.1
node_id: RE_kwDODs4PE84HCYUE
tag_name: 1.3.1
target_commitish: main
name: 1.3.1
created_at: 2023-08-21T18:58:12Z
published_at: 2023-08-21T18:59:10Z
body:
  - Fixed a bug with the `--plugin-secret` option when deployed using more recent versions of the `flyctl` command. Thanks, [Franz Novak](https://github.com/fndiri) and [Cade Ekblad-Frank](https://github.com/cadeef). [#29](https://github.com/simonw/datasette-publish-fly/issues/29)

reactions:
  {"url": "https://api.github.com/repos/simonw/datasette-publish-fly/releases/118064388/reactions", "total_count": 1, "+1": 1, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/datasette-ripgrep/releases/tag/0.8.1
node_id: RE_kwDOEtKqL84HCdWr
tag_name: 0.8.1
target_commitish: main
name: 0.8.1
created_at: 2023-08-21T22:35:12Z
published_at: 2023-08-21T22:36:11Z
updated_at: 2023-08-21T22:36:11Z
body:
  - Only show the navigation menu item if the plugin has been configured. [#28](https://github.com/simonw/datasette-ripgrep/issues/28)


html_url: https://github.com/simonw/datasette-auth-tokens/releases/tag/0.4a1
node_id: RE_kwDOEDFIuM4HCfS5
tag_name: 0.4a1
target_commitish: main
name: 0.4a1
created_at: 2023-08-21T23:51:22Z
published_at: 2023-08-21T23:52:56Z
updated_at: 2023-08-21T23:52:56Z
body:
  - Multiple database support for managed tokens mode: use the new `manage_tokens_database` setting to specify which database should hold the authentication tokens. [#11](https://github.com/simonw/datasette-auth-tokens/issues/11)
  - Cosmetic improvements to the display of the token creation page. [#12](https://github.com/simonw/datasette-auth-tokens/issues/12), [#13](https://github.com/simonw/datasette-auth-tokens/issues/13)


html_url: https://github.com/simonw/datasette/releases/tag/1.0a4
node_id: RE_kwDOBm6k_c4HDEhD
tag_name: 1.0a4
target_commitish: main
name: 1.0a4
created_at: 2023-08-22T17:10:01Z
published_at: 2023-08-22T17:13:26Z
updated_at: 2023-08-22T17:13:26Z
body:
  This alpha fixes a security issue with the `/-/api` API explorer. On authenticated Datasette instances (instances protected using plugins such as [datasette-auth-passwords](https://datasette.io/plugins/datasette-auth-passwords)) the API explorer interface could reveal the names of databases and tables within the protected instance. The data stored in those tables was not revealed.

  For more information and workarounds, read [the security advisory](https://github.com/simonw/datasette/security/advisories/GHSA-7ch3-7pp7-7cpq). The issue has been present in every previous alpha version of Datasette 1.0: versions 1.0a0, 1.0a1, 1.0a2 and 1.0a3.

  Also in this alpha:

  - The new `datasette plugins --requirements` option outputs a list of currently installed plugins in Python `requirements.txt` format, useful for duplicating that installation elsewhere. ([#2133](https://github.com/simonw/datasette/issues/2133))
  - [Writable canned queries](https://docs.datasette.io/en/latest/sql_queries.html#canned-queries-writable) can now define a `on_success_message_sql` field in their configuration, containing a SQL query that should be executed upon successful completion of the write operation in order to generate a message to be shown to the user. ([#2138](https://github.com/simonw/datasette/issues/2138))
  - The automatically generated border color for a database is now shown in more places around the application. ([#2119](https://github.com/simonw/datasette/issues/2119))
  - Every instance of example shell script code in the documentation should now include a working copy button, free from additional syntax. ([#2140](https://github.com/simonw/datasette/issues/2140))

reactions:
  {"url": "https://api.github.com/repos/simonw/datasette/releases/118245443/reactions", "total_count": 3, "+1": 0, "-1": 0, "laugh": 0, "hooray": 2, "confused": 0, "heart": 1, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/datasette-configure-fts/releases/tag/1.1.2
node_id: RE_kwDODolrvM4HD2tQ
tag_name: 1.1.2
target_commitish: main
name: 1.1.2
created_at: 2023-08-23T18:40:42Z
published_at: 2023-08-23T18:41:23Z
updated_at: 2023-08-23T18:41:23Z
body:
  - Fixed visual display bug with the form labels. [#14](https://github.com/simonw/datasette-configure-fts/issues/14)


html_url: https://github.com/simonw/datasette-jellyfish/releases/tag/1.0.2
node_id: RE_kwDOCmnxEc4HEjEN
tag_name: 1.0.2
target_commitish: main
name: 1.0.2
created_at: 2023-08-24T21:37:11Z
published_at: 2023-08-24T21:39:33Z
body:
  - Fixed a dependency issue by pinning to [jellyfish 0.9.0](https://jamesturk.github.io/jellyfish/changelog/#090-7-january-2021), the last version to include the `porter_stem` function. Thanks, [Eric Xanderson](https://github.com/disarticulate). [#6](https://github.com/simonw/datasette-jellyfish/issues/6)


html_url: https://github.com/simonw/datasette-jellyfish/releases/tag/2.0
node_id: RE_kwDOCmnxEc4HEjMZ
tag_name: 2.0
target_commitish: main
name: 2.0
created_at: 2023-08-24T21:43:34Z
published_at: 2023-08-24T21:45:20Z
body:
  - Removed support for the `porter_stem()` function, which is no longer supported by the underlying [jellyfish](https://github.com/jamesturk/jellyfish) library. [#6](https://github.com/simonw/datasette-jellyfish/issues/6)


html_url: https://github.com/simonw/datasette/releases/tag/1.0a5
node_id: RE_kwDOBm6k_c4HGYO5
tag_name: 1.0a5
target_commitish: main
name: 1.0a5
created_at: 2023-08-29T17:17:54Z
published_at: 2023-08-29T17:19:35Z
updated_at: 2023-08-29T17:19:35Z
body:
  - When restrictions are applied to [API tokens](https://docs.datasette.io/en/1.0a5/authentication.html#createtokenview), those restrictions now behave slightly differently: applying the `view-table` restriction will imply the ability to `view-database` for the database containing that table, and both `view-table` and `view-database` will imply `view-instance`. Previously you needed to create a token with restrictions that explicitly listed `view-instance` and `view-database` and `view-table` in order to view a table without getting a permission denied error. ([#2102](https://github.com/simonw/datasette/issues/2102))
  - New `datasette.yaml` (or `.json`) configuration file, which can be specified using `datasette -c path-to-file`. The goal here to consolidate settings, plugin configuration, permissions, canned queries, and other Datasette configuration into a single single file, separate from `metadata.yaml`. The legacy `settings.json` config file used for [Configuration directory mode](https://docs.datasette.io/en/1.0a5/settings.html#config-dir) has been removed, and `datasette.yaml` has a `"settings"` section where the same settings key/value pairs can be included. In the next future alpha release, more configuration such as plugins/permissions/canned queries will be moved to the `datasette.yaml` file. See [#2093](https://github.com/simonw/datasette/issues/2093) for more details. Thanks, Alex Garcia.
  - The `-s/--setting` option can now take dotted paths to nested settings. These will then be used to set or over-ride the same options as are present in the new configuration file. ([#2156](https://github.com/simonw/datasette/issues/2156))
  - New `--actor '{"id": "json-goes-here"}'` option for use with `datasette --get` to treat the simulated request as being made by a specific actor, see [datasette --get](https://docs.datasette.io/en/1.0a5/cli-reference.html#cli-datasette-get). ([#2153](https://github.com/simonw/datasette/issues/2153))
  - The Datasette `_internal` database has had some changes. It no longer shows up in the `datasette.databases` list by default, and is now instead available to plugins using the `datasette.get_internal_database()`. Plugins are invited to use this as a private database to store configuration and settings and secrets that should not be made visible through the default Datasette interface. Users can pass the new `--internal internal.db` option to persist that internal database to disk. Thanks, Alex Garcia. ([#2157](https://github.com/simonw/datasette/issues/2157)).


html_url: https://github.com/simonw/datasette-auth-tokens/releases/tag/0.4a2
node_id: RE_kwDOEDFIuM4HGbXq
tag_name: 0.4a2
target_commitish: main
name: 0.4a2
created_at: 2023-08-29T18:55:53Z
published_at: 2023-08-29T18:56:41Z
updated_at: 2023-08-29T18:56:41Z
body:
  - Fix bug where an invalid signature on an incoming `dstok_` token caused a 500 error. [#14](https://github.com/simonw/datasette-auth-tokens/issues/14)


html_url: https://github.com/datasette/datasette-visible-internal-db/releases/tag/0.1
node_id: RE_kwDOKNibWM4HHS7J
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2023-08-30T22:41:27Z
published_at: 2023-08-30T22:42:27Z
updated_at: 2023-08-30T22:42:27Z
body:
  - Initial release. Installing this plugin makes the `/_internal` database visible again in [Datasette 1.0a5](https://docs.datasette.io/en/1.0a5/changelog.html) or higher. [#1](https://github.com/datasette/datasette-visible-internal-db/issues/1)


html_url: https://github.com/simonw/datasette-auth-tokens/releases/tag/0.4a3
node_id: RE_kwDOEDFIuM4HH9S8
tag_name: 0.4a3
target_commitish: main
name: 0.4a3
created_at: 2023-08-31T22:30:28Z
published_at: 2023-08-31T22:31:10Z
updated_at: 2023-08-31T22:31:17Z
body:
  - Token permissions are now displayed in a more human-readable way. [#9](https://github.com/simonw/datasette-auth-tokens/issues/9)
  - New `/-/api/tokens` interface for viewing and revoking managed tokens. [#15](https://github.com/simonw/datasette-auth-tokens/issues/15)
  - Only the creator of a token or a user with the new `auth-tokens-revoke-any` permission can revoke a token. [#16](https://github.com/simonw/datasette-auth-tokens/issues/16)
  - Tokens now record when they expired or were revoked in the new `ended_timestamp` column. [#17](https://github.com/simonw/datasette-auth-tokens/issues/17)
  - Now defaults to storing tokens in the new [internal database](https://docs.datasette.io/en/1.0a5/internals.html#datasette-s-internal-database) from Datasette 1.0a5. [#18](https://github.com/simonw/datasette-auth-tokens/issues/18)


html_url: https://github.com/simonw/llm/releases/tag/0.8.1
node_id: RE_kwDOJRhX7M4HIBtQ
tag_name: 0.8.1
target_commitish: 0.8.x
name: 0.8.1
created_at: 2023-09-01T03:33:41Z
published_at: 2023-09-01T03:35:01Z
updated_at: 2023-09-01T03:35:01Z
body:
  - Fixed bug where first prompt would show an error if the `io.datasette.llm` directory had not yet been created. [#193](https://github.com/simonw/llm/issues/193)
  - Updated documentation to recommend a different `llm-gpt4all` model since the one we were using is no longer available. [#195](https://github.com/simonw/llm/issues/195)


html_url: https://github.com/simonw/llm/releases/tag/0.9a0
node_id: RE_kwDOJRhX7M4HIpY5
tag_name: 0.9a0
target_commitish: main
name: 0.9a0
created_at: 2023-09-02T17:52:36Z
published_at: 2023-09-02T17:54:26Z
body: - Alpha release of embeddings support. #185
updated_at: 2023-09-02T17:54:26Z
reactions:
  {"url": "https://api.github.com/repos/simonw/llm/releases/119707193/reactions", "total_count": 3, "+1": 0, "-1": 0, "laugh": 0, "hooray": 1, "confused": 0, "heart": 2, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/llm/releases/tag/0.9a1
node_id: RE_kwDOJRhX7M4HI08d
tag_name: 0.9a1
target_commitish: main
name: 0.9a1
created_at: 2023-09-04T01:18:13Z
published_at: 2023-09-04T01:28:05Z
updated_at: 2023-09-04T01:28:05Z
body:
  - Second embeddings alpha. [#192](https://github.com/simonw/llm/issues/192), [#209](https://github.com/simonw/llm/issues/209), [#211](https://github.com/simonw/llm/issues/211), [#213](https://github.com/simonw/llm/issues/213), [#215](https://github.com/simonw/llm/issues/215), [#217](https://github.com/simonw/llm/issues/217), [#218](https://github.com/simonw/llm/issues/218), [#219](https://github.com/simonw/llm/issues/219), [#222](https://github.com/simonw/llm/issues/222)


html_url: https://github.com/simonw/llm/releases/tag/0.9
node_id: RE_kwDOJRhX7M4HI13g
tag_name: 0.9
target_commitish: main
name: 0.9
created_at: 2023-09-04T02:39:10Z
published_at: 2023-09-04T02:40:54Z
updated_at: 2023-09-04T02:40:54Z
body:
  The big new feature in this release is support for **embeddings**.

  [Embedding models](https://llm.datasette.io/en/stable/embeddings/index.html#embeddings) take a piece of text - a word, sentence, paragraph or even a whole article, and convert that into an array of floating point numbers. [#185](https://github.com/simonw/llm/issues/185)

  This embedding vector can be thought of as representing a position in many-dimensional-space, where the distance between two vectors represents how semantically similar they are to each other within the content of a language model.

  Embeddings can be used to find **related documents**, and also to implement **semantic search** - where a user can search for a phrase and get back results that are semantically similar to that phrase even if they do not share any exact keywords.

  LLM now provides both CLI and Python APIs for working with embeddings. Embedding models are defined by plugins, so you can install additional models using the [plugins mechanism](https://llm.datasette.io/en/stable/plugins/installing-plugins.html#installing-plugins).

  The first two embedding models supported by LLM are:

  - OpenAI's [ada-002](https://platform.openai.com/docs/guides/embeddings) embedding model, available via an inexpensive API if you set an OpenAI key using `llm keys set openai`.
  - The [sentence-transformers](https://www.sbert.net/) family of models, available via the new [llm-sentence-transformers](https://github.com/simonw/llm-sentence-transformers) plugin.

  See [Embedding with the CLI](https://llm.datasette.io/en/stable/embeddings/cli.html#embeddings-cli) for detailed instructions on working with embeddings using LLM.

  The new commands for working with embeddings are:

  - **[llm embed](https://llm.datasette.io/en/stable/embeddings/cli.html#embeddings-cli-embed)** - calculate embeddings for content and return them to the console or store them in a SQLite database.
  - **[llm embed-multi](https://llm.datasette.io/en/stable/embeddings/cli.html#embeddings-cli-embed-multi)** - run bulk embeddings for multiple strings, using input from a CSV, TSV or JSON file, data from a SQLite database or data found by scanning the filesystem. [#215](https://github.com/simonw/llm/issues/215)
  - **[llm similar](https://llm.datasette.io/en/stable/embeddings/cli.html#embeddings-cli-similar)** - run similarity searches against your stored embeddings - starting with a search phrase or finding content related to a previously stored vector. [#190](https://github.com/simonw/llm/issues/190)
  - **[llm embed-models](https://llm.datasette.io/en/stable/embeddings/cli.html#embeddings-cli-embed-models)** - list available embedding models.
  - **[llm embed-db](https://llm.datasette.io/en/stable/help.html#help-embed-db)** - commands for inspecting and working with the default embeddings SQLite database.

  There's also a new [llm.Collection](https://llm.datasette.io/en/stable/embeddings/python-api.html#embeddings-python-collections) class for creating and searching collections of embedding from Python code, and a [llm.get_embedding_model()](https://llm.datasette.io/en/stable/embeddings/python-api.html#embeddings-python-api) interface for embedding strings directly. [#191](https://github.com/simonw/llm/issues/191)

reactions:
  {"url": "https://api.github.com/repos/simonw/llm/releases/119758304/reactions", "total_count": 1, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 1, "eyes": 0}


html_url: https://github.com/simonw/llm/releases/tag/0.10a0
node_id: RE_kwDOJRhX7M4HJVpS
tag_name: 0.10a0
target_commitish: main
name: 0.10a0
created_at: 2023-09-05T06:41:51Z
published_at: 2023-09-05T06:43:09Z
updated_at: 2023-09-05T06:43:09Z
body:
  - New [llm chat](https://llm.datasette.io/en/latest/usage.html#usage-chat) command for starting an interactive terminal chat with a model. [#231](https://github.com/simonw/llm/issues/231)
  - `llm embed-multi --files` now has an `--encoding` option and defaults to falling back to `latin-1` if a file cannot be processed as `utf-8`. [#225](https://github.com/simonw/llm/issues/225)


html_url: https://github.com/simonw/datasette-edit-schema/releases/tag/0.6a0
node_id: RE_kwDODsD4Ds4HKhud
tag_name: 0.6a0
target_commitish: foreign-keys
name: 0.6a0
created_at: 2023-09-06T22:30:16Z
published_at: 2023-09-06T22:30:57Z
updated_at: 2023-09-06T22:30:57Z
body:
  - Preview of add and edit foreign keys. [#7](https://github.com/simonw/datasette-edit-schema/issues/7)


html_url: https://github.com/simonw/datasette-edit-schema/releases/tag/0.6a1
node_id: RE_kwDODsD4Ds4HKibd
tag_name: 0.6a1
target_commitish: foreign-keys
name: 0.6a1
created_at: 2023-09-06T23:25:59Z
published_at: 2023-09-06T23:26:31Z
updated_at: 2023-09-06T23:26:31Z
body:
  - Ability to set or update a table's primary key. [#1](https://github.com/simonw/datasette-edit-schema/issues/1)


html_url: https://github.com/simonw/datasette-graphql/releases/tag/3.0a0
node_id: RE_kwDOEPNYIc4HK-vI
tag_name: 3.0a0
target_commitish: datasette-1-compat
name: 3.0a0
created_at: 2023-09-07T16:50:57Z
published_at: 2023-09-07T16:51:35Z
updated_at: 2023-09-07T16:51:35Z
body:
  - Upgraded for compatibility with the Datasette 1.0 alpha series. [#96](https://github.com/simonw/datasette-graphql/issues/96)


html_url: https://github.com/simonw/datasette/releases/tag/1.0a6
node_id: RE_kwDOBm6k_c4HLMeN
tag_name: 1.0a6
target_commitish: main
name: 1.0a6
created_at: 2023-09-08T04:44:08Z
published_at: 2023-09-08T04:45:12Z
updated_at: 2023-09-08T04:45:12Z
body:
  - New plugin hook: [actors_from_ids(datasette, actor_ids)](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-actors-from-ids) and an internal method to accompany it, [await .actors_from_ids(actor_ids)](https://docs.datasette.io/en/latest/internals.html#datasette-actors-from-ids). This mechanism is intended to be used by plugins that may need to display the actor who was responsible for something managed by that plugin: they can now resolve the recorded IDs of actors into the full actor objects. ([#2181](https://github.com/simonw/datasette/issues/2181))
  - `DATASETTE_LOAD_PLUGINS` environment variable for [controlling which plugins](https://docs.datasette.io/en/latest/plugins.html#plugins-datasette-load-plugins) are loaded by Datasette. ([#2164](https://github.com/simonw/datasette/issues/2164))
  - Datasette now checks if the user has permission to view a table linked to by a foreign key before turning that foreign key into a clickable link. ([#2178](https://github.com/simonw/datasette/issues/2178))
  - The `execute-sql` permission now implies that the actor can also view the database and instance. ([#2169](https://github.com/simonw/datasette/issues/2169))
  - Documentation describing a pattern for building plugins that themselves [define further hooks](https://docs.datasette.io/en/latest/writing_plugins.html#writing-plugins-extra-hooks) for other plugins. ([#1765](https://github.com/simonw/datasette/issues/1765))
  - Datasette is now tested against the Python 3.12 preview. ([#2175](https://github.com/simonw/datasette/pull/2175))


html_url: https://github.com/simonw/datasette-llm-embed/releases/tag/0.1a0
node_id: RE_kwDOKRMeGc4HLpX9
tag_name: 0.1a0
target_commitish: main
name: 0.1a0
created_at: 2023-09-08T21:49:14Z
published_at: 2023-09-08T21:50:46Z
body:
  - Initial release, with `llm_embed(model_id, text)` SQL function. [#1](https://github.com/simonw/datasette-llm-embed/issues/1)


html_url: https://github.com/simonw/datasette-edit-schema/releases/tag/0.6
node_id: RE_kwDODsD4Ds4HLq76
tag_name: 0.6
target_commitish: main
name: 0.6
created_at: 2023-09-09T00:19:02Z
published_at: 2023-09-09T00:20:57Z
updated_at: 2023-09-09T00:20:57Z
body:
  New features:
  - Create a new table, setting the name of the primary key and adding multiple columns of different types. [#5](https://github.com/simonw/datasette-edit-schema/issues/5)
  - Set or change the primary key for a table. [#1](https://github.com/simonw/datasette-edit-schema/issues/1)
  - Add and edit foreign key relationships for a table. [#7](https://github.com/simonw/datasette-edit-schema/issues/7)
  - When altering a table, each column now shows a small sample of example values to help you decide the column's new name and type. [#28](https://github.com/simonw/datasette-edit-schema/issues/28)
  - Delete table button now asks for confirmation. [#41](https://github.com/simonw/datasette-edit-schema/issues/41)


html_url: https://github.com/simonw/sqlite-utils/releases/tag/3.35.1
node_id: RE_kwDOCGYnMM4HLrP3
tag_name: 3.35.1
target_commitish: main
name: 3.35.1
created_at: 2023-09-09T00:49:55Z
published_at: 2023-09-09T00:50:42Z
updated_at: 2023-09-09T00:50:42Z
body:
  - Fixed a bug where [table.transform()](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-transform) would sometimes re-assign the `rowid` values for a table rather than keeping them consistent across the operation. ([#592](https://github.com/simonw/sqlite-utils/issues/592))


html_url: https://github.com/simonw/datasette-cluster-map/releases/tag/0.18a0
node_id: RE_kwDOB8NBWs4HMWeg
tag_name: 0.18a0
target_commitish: datasette-1-0
name: 0.18a0
created_at: 2023-09-11T17:27:15Z
published_at: 2023-09-11T17:27:44Z
body:
  - Compatible with Datasette 1.0 alphas (but no longer compatible with the 0.x series, hence the alpha release). [#42](https://github.com/simonw/datasette-cluster-map/issues/42)


html_url: https://github.com/simonw/llm/releases/tag/0.10a1
node_id: RE_kwDOJRhX7M4HMlWi
tag_name: 0.10a1
target_commitish: main
name: 0.10a1
created_at: 2023-09-12T05:57:54Z
published_at: 2023-09-12T06:00:39Z
updated_at: 2023-09-12T06:00:39Z
body:
  -   Support for embedding binary data. [#254](https://github.com/simonw/llm/pull/254)
  -   `llm chat` now works for models with API keys. [#247](https://github.com/simonw/llm/issues/247)
  -   `llm chat -o` for passing options to a model. [#244](https://github.com/simonw/llm/issues/244)
  -   `llm chat --no-stream` option. [#248](https://github.com/simonw/llm/issues/248)
  -   `LLM_LOAD_PLUGINS` environment variable. [#256](https://github.com/simonw/llm/issues/256)
  -   `llm plugins --all` option for including builtin plugins. [#259](https://github.com/simonw/llm/issues/259)
  -   `llm embed-db` has been renamed to `llm collections`. [#229](https://github.com/simonw/llm/issues/229)
  -   Fixed bug where `llm embed -c` option was treated as a filepath, not a string. Thanks, [mhalle](https://github.com/mhalle). [#263](https://github.com/simonw/llm/pull/263)


html_url: https://github.com/simonw/llm/releases/tag/0.10
node_id: RE_kwDOJRhX7M4HNAuK
tag_name: 0.10
target_commitish: main
name: 0.10
created_at: 2023-09-12T19:11:25Z
published_at: 2023-09-12T19:13:39Z
updated_at: 2023-09-12T19:13:39Z
body:
  The two major features in this release are the **[llm chat command](https://llm.datasette.io/en/stable/usage.html#usage-chat)** and support for **embedding binary data**.

  ### llm chat

  The new `llm chat` command starts an ongoing chat conversation with a model in your terminal. It works with all models supported by LLM and its [plugins](https://llm.datasette.io/en/stable/plugins/index.html#plugins), including locally installed models such as Llama 2. [#231](https://github.com/simonw/llm/issues/231)

  This offers a big performance boost for local models, since they don't need to be freshly loaded into memory for each prompt.

  Here's an example chat with Llama 2 13B, provided by the [llm-mlc](https://github.com/simonw/llm-mlc) plugin.
  ```bash
  llm  chat  -m  mlc-chat-Llama-2-13b-chat-hf-q4f16_1
  ```
  This starts a chat session:
  ```
  Type 'exit' or 'quit' to exit
  Type '!multi' to enter multiple lines, then '!end' to finish
  > Who are you?
  Hello! I'm just an AI, here to assist you with any questions you may have.
  My name is LLaMA, and I'm a large language model trained to provide helpful
  and informative responses to a wide range of questions and topics. I'm here
  to help you find the information you need, while ensuring a safe and
  respectful conversation. Please feel free to ask me anything, and I'll do my
  best to provide a helpful and accurate response.
  > Tell me a joke about otters
  Sure, here's a joke about otters:

  Why did the otter go to the party?

  Because he heard it was a "whale" of a time!

  (Get it? Whale, like a big sea mammal, but also a "wild" or "fun" time.
  Otters are known for their playful and social nature, so it's a lighthearted
  and silly joke.)

  I hope that brought a smile to your face! Do you have any other questions or
  topics you'd like to discuss?
  > exit
  ```
  Chat sessions are [logged to SQLite](https://llm.datasette.io/en/stable/logging.html#logging) - use `llm logs` to view them. They can accept system prompts, templates and model options - consult [the chat documentation](https://llm.datasette.io/en/stable/usage.html#usage-chat) for details.

  ### Binary embedding support

  LLM's [embeddings feature](https://llm.datasette.io/en/stable/embeddings/index.html#embeddings) has been expanded to provide support for embedding binary data, in addition to text. [#254](https://github.com/simonw/llm/pull/254)

  This enables models like [CLIP](https://openai.com/research/clip), supported by the new **[llm-clip](https://github.com/simonw/llm-clip)** plugin.

  CLIP is a multi-modal embedding model which can embed images and text into the same vector space. This means you can use it to create an embedding index of photos, and then search for the embedding vector for "a happy dog" and get back images that are semantically closest to that string.

  To create embeddings for every JPEG in a directory stored in a `photos` collection, run:
  ```bash
  llm install  llm-clip
  llm embed-multi  photos  --files  photos/  '*.jpg'  --binary  -m  clip
  ```
  Now you can search for photos of racoons using:
  ```bash
  llm similar photos -c 'raccoon'
  ```
  This spits out a list of images, ranked by how similar they are to the string "raccoon":
  ```
  {"id": "IMG_4801.jpeg", "score": 0.28125139257127457, "content": null, "metadata": null}
  {"id": "IMG_4656.jpeg", "score": 0.26626441704164294, "content": null, "metadata": null}
  {"id": "IMG_2944.jpeg", "score": 0.2647445926996852, "content": null, "metadata": null}
  ...
  ```
  ### Also in this release

  - The [LLM_LOAD_PLUGINS environment variable](https://llm.datasette.io/en/stable/plugins/installing-plugins.html#llm-load-plugins) can be used to control which plugins are loaded when `llm` starts running. [#256](https://github.com/simonw/llm/issues/256)
  - The `llm plugins --all` option includes builtin plugins in the list of plugins. [#259](https://github.com/simonw/llm/issues/259)
  - The `llm embed-db` family of commands has been renamed to `llm collections`. [#229](https://github.com/simonw/llm/issues/229)
  - `llm embed-multi --files` now has an `--encoding` option and defaults to falling back to `latin-1` if a file cannot be processed as `utf-8`. [#225](https://github.com/simonw/llm/issues/225)


html_url: https://github.com/simonw/datasette-export-notebook/releases/tag/1.0.1
node_id: RE_kwDOE4E6F84HO6SE
tag_name: 1.0.1
target_commitish: main
name: 1.0.1
created_at: 2023-09-15T18:58:53Z
published_at: 2023-09-15T18:59:37Z
body:
  - Now also works with the Datasette 1.0 alpha series. [#17](https://github.com/simonw/datasette-export-notebook/issues/17)


html_url: https://github.com/simonw/llm/releases/tag/0.11
node_id: RE_kwDOJRhX7M4HQAcC
tag_name: 0.11
target_commitish: main
name: 0.11
created_at: 2023-09-19T06:35:04Z
published_at: 2023-09-19T06:35:34Z
updated_at: 2023-09-19T06:35:34Z
body:
  LLM now supports the new OpenAI `gpt-3.5-turbo-instruct` model, and OpenAI completion (as opposed to chat completion) models in general. [#284](https://github.com/simonw/llm/issues/284)

  ```bash
  llm -m gpt-3.5-turbo-instruct 'Reasons to tame a wild beaver:'
  ```
  OpenAI completion models like this support a `-o logprobs 3` option, which accepts a number between 1 and 5 and will include the log probabilities (for each produced token, what were the top 3 options considered by the model) in the logged response.

  ```bash
  llm -m gpt-3.5-turbo-instruct 'Say hello succinctly' -o logprobs 3
  ```
  You can then view the `logprobs` that were recorded in the SQLite logs database like this:
  ```bash
  sqlite-utils "$(llm logs path)" \
    'select * from responses order by id desc limit 1' | \
    jq '.[0].response_json' -r | jq
  ```
  Truncated output looks like this:
  ```
    [
      {
        "text": "Hi",
        "top_logprobs": [
          {
            "Hi": -0.13706253,
            "Hello": -2.3714375,
            "Hey": -3.3714373
          }
        ]
      },
      {
        "text": " there",
        "top_logprobs": [
          {
            " there": -0.96057636,
            "!\"": -0.5855763,
            ".\"": -3.2574513
          }
        ]
      }
    ]
  ```
  Also in this release:

  - The `llm.user_dir()` function, used by plugins, now ensures the directory exists before returning it. [#275](https://github.com/simonw/llm/issues/275)
  - New `LLM_OPENAI_SHOW_RESPONSES=1` environment variable for displaying the full HTTP response returned by OpenAI compatible APIs. [#286](https://github.com/simonw/llm/issues/286)
  - The `llm embed-multi` command now has a `--batch-size X` option for setting the batch size to use when processing embeddings - useful if you have limited memory available. [#273](https://github.com/simonw/llm/issues/273)
  - The `collection.embed_multi()` method also now accepts an optional `batch_size=int` argument.
  - Fixed two bugs with `llm embed-multi --files` relating to handling of directories. Thanks, [ealvar3z](https://github.com/ealvar3z). [#274](https://github.com/simonw/llm/issues/274), [#280](https://github.com/simonw/llm/issues/280)


html_url: https://github.com/simonw/datasette-mask-columns/releases/tag/0.2.2
node_id: RE_kwDODnCaZ84HQlsd
tag_name: 0.2.2
target_commitish: main
name: 0.2.2
created_at: 2023-09-20T02:16:24Z
published_at: 2023-09-20T02:17:37Z
body:
  - Fix error with recent versions of Jinja. Thanks, [Andreas Segerberg](https://github.com/Segerberg). [#3](https://github.com/simonw/datasette-mask-columns/issues/3)


html_url: https://github.com/datasette/datasette-sqlite-debug-authorizer/releases/tag/0.1
node_id: RE_kwDOKVzq2s4HQm9d
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2023-09-20T03:31:50Z
published_at: 2023-09-20T03:33:13Z
body:
  - Initial release. Outputs all calls to the `conn.set_authorizer()` hook to standard error. [#1](https://github.com/datasette/datasette-sqlite-debug-authorizer/issues/1) 


html_url: https://github.com/simonw/datasette-upload-dbs/releases/tag/0.3.1
node_id: RE_kwDOHSfuMs4HQnyL
tag_name: 0.3.1
target_commitish: main
name: 0.3.1
created_at: 2023-09-20T04:18:06Z
published_at: 2023-09-20T04:18:36Z
updated_at: 2023-09-20T04:18:36Z
body:
  - More self-explanatory copy on the upload database page. [#11](https://github.com/simonw/datasette-upload-dbs/issues/11)


html_url: https://github.com/simonw/datasette/releases/tag/0.64.4
node_id: RE_kwDOBm6k_c4HRz08
tag_name: 0.64.4
target_commitish: 0.64.x
name: 0.64.4
created_at: 2023-09-21T19:28:45Z
published_at: 2023-09-21T19:43:54Z
updated_at: 2023-09-21T19:43:54Z
body:
  - Fix for a crashing bug caused by viewing the table page for a named in-memory database. [#2189](https://github.com/simonw/datasette/issues/2189)


html_url: https://github.com/simonw/datasette-auth-tokens/releases/tag/0.4a4
node_id: RE_kwDOEDFIuM4HT3O1
tag_name: 0.4a4
target_commitish: main
name: 0.4a4
created_at: 2023-09-26T16:16:26Z
published_at: 2023-09-26T16:18:26Z
updated_at: 2023-09-26T16:18:26Z
body:
  Improvements to the create token page for managed token mode. [#21](https://github.com/simonw/datasette-auth-tokens/issues/21)

  - Don't show `permissions-debug` and `debug-menu`, since they don't make sense for API tokens to use.
  - Include short descriptions of each permission.


html_url: https://github.com/simonw/datasette-llm-embed/releases/tag/0.1a1
node_id: RE_kwDOKRMeGc4HZouu
tag_name: 0.1a1
target_commitish: main
name: 0.1a1
created_at: 2023-10-08T01:35:55Z
published_at: 2023-10-08T01:36:59Z
body:
  - New `llm_embed_cosine(a, b)` function to calculate cosine similarity between two binary blob vectors. [#2](https://github.com/simonw/datasette-llm-embed/issues/2)


html_url: https://github.com/simonw/datasette-llm-embed/releases/tag/0.1
node_id: RE_kwDOKRMeGc4HZp19
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2023-10-08T04:27:42Z
published_at: 2023-10-08T04:31:34Z
body:
  - First non-alpha release.
  - `llm_embed(model_id, value)` function now works for models that require API keys, such as `ada-002`. The key can be configured as a plugin secret in the `metadata.json` or `metadata.yaml` file. [#3](https://github.com/simonw/datasette-llm-embed/issues/3)


html_url: https://github.com/simonw/datasette/releases/tag/0.64.5
node_id: RE_kwDOBm6k_c4HZuBY
tag_name: 0.64.5
target_commitish: 0.64.x
name: 0.64.5
created_at: 2023-10-08T16:03:37Z
published_at: 2023-10-08T16:05:20Z
updated_at: 2023-10-08T16:05:20Z
body:
  - Dropped dependency on `click-default-group-wheel`, which could cause a dependency conflict. ([#2197](https://github.com/simonw/datasette/issues/2197))

reactions:
  {"url": "https://api.github.com/repos/simonw/datasette/releases/124182616/reactions", "total_count": 1, "+1": 1, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/datasette-llm-embed/releases/tag/0.2
node_id: RE_kwDOKRMeGc4HZumC
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2023-10-08T17:41:52Z
published_at: 2023-10-08T17:42:55Z
body:
  - New `llm_embed_decode(blob)` function returning a string JSON array of floats. [#4](https://github.com/simonw/datasette-llm-embed/issues/4)


html_url: https://github.com/simonw/datasette-ripgrep/releases/tag/0.8.2
node_id: RE_kwDOEtKqL84Him9_
tag_name: 0.8.2
target_commitish: main
name: 0.8.2
created_at: 2023-10-25T00:06:28Z
published_at: 2023-10-25T00:09:02Z
updated_at: 2023-10-25T00:09:02Z
body:
  - Fix for issue where templates were not rendered with access to the current request. [#29](https://github.com/simonw/datasette-ripgrep/issues/29)


html_url: https://github.com/simonw/datasette-edit-schema/releases/tag/0.7
node_id: RE_kwDODsD4Ds4HjTld
tag_name: 0.7
target_commitish: main
name: 0.7
created_at: 2023-10-26T00:47:27Z
published_at: 2023-10-26T00:49:02Z
updated_at: 2023-10-26T00:49:02Z
body:
  - Ability to add an index (or a unique index) to a column on a table. [#27](https://github.com/simonw/datasette-edit-schema/issues/27)
  - Ability to drop an index from a table.


html_url: https://github.com/simonw/llm/releases/tag/0.11.1
node_id: RE_kwDOJRhX7M4HmRhb
tag_name: 0.11.1
target_commitish: main
name: 0.11.1
created_at: 2023-11-01T04:29:59Z
published_at: 2023-11-01T04:31:34Z
updated_at: 2023-11-01T04:31:34Z
body:
  - Fixed a bug where `llm embed -c "text"` did not correctly pick up the configured [default embedding model](https://llm.datasette.io/en/stable/embeddings/cli.html#embeddings-cli-embed-models-default). [#317](https://github.com/simonw/llm/issues/317)
  - New plugins: [llm-python](https://github.com/simonw/llm-python), [llm-bedrock-anthropic](https://github.com/sblakey/llm-bedrock-anthropic) and [llm-embed-jina](https://github.com/simonw/llm-embed-jina) (described in [Execute Jina embeddings with a CLI using llm-embed-jina](https://simonwillison.net/2023/Oct/26/llm-embed-jina/)).
  - [llm-gpt4all](https://github.com/simonw/llm-gpt4all) now uses the new GGUF model format. [simonw/llm-gpt4all#16](https://github.com/simonw/llm-gpt4all/issues/16)


html_url: https://github.com/simonw/shot-scraper/releases/tag/1.3
node_id: RE_kwDOG-A5W84HmxQj
tag_name: 1.3
target_commitish: main
name: 1.3
created_at: 2023-11-01T22:08:39Z
published_at: 2023-11-01T22:13:54Z
updated_at: 2023-11-02T11:42:04Z
body:
  - New `--bypass-csp` option for bypassing any Content Security Policy on the page that prevents executing further JavaScript. Thanks, [Brenton Cleeland](https://github.com/sesh). [#116](https://github.com/simonw/shot-scraper/pull/116)
  - Screenshots taken using `shot-scraper --interactive $URL` - which allows you to interact with the page in a browser window and then hit `<enter>` to take the screenshot - it no longer reloads the page before taking the shot (which ignored your activity). [#125](https://github.com/simonw/shot-scraper/issues/125)
  - Improved accessibility of [documentation](https://shot-scraper.datasette.io). Thanks, [Paolo Melchiorre](https://github.com/pauloxnet). [#120](https://github.com/simonw/shot-scraper/pull/120)

reactions:
  {"url": "https://api.github.com/repos/simonw/shot-scraper/releases/127603747/reactions", "total_count": 4, "+1": 0, "-1": 0, "laugh": 0, "hooray": 4, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/sqlite-utils/releases/tag/3.35.2
node_id: RE_kwDOCGYnMM4HoKCs
tag_name: 3.35.2
target_commitish: main
name: 3.35.2
created_at: 2023-11-04T01:03:42Z
published_at: 2023-11-04T01:05:56Z
updated_at: 2023-11-04T01:05:56Z
body:
  - The `--load-extension=spatialite` option and [find_spatialite()](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-gis-find-spatialite) utility function now both work correctly on `arm64` Linux. Thanks, [Mike Coats](https://github.com/MikeCoats). ([#599](https://github.com/simonw/sqlite-utils/issues/599))
  - Fix for bug where `sqlite-utils insert` could cause your terminal cursor to disappear. Thanks, [Luke Plant](https://github.com/spookylukey). ([#433](https://github.com/simonw/sqlite-utils/issues/433))
  - `datetime.timedelta` values are now stored as `TEXT` columns. Thanks, [Harald Nezbeda](https://github.com/nezhar). ([#522](https://github.com/simonw/sqlite-utils/issues/522))
  - Test suite is now also run against Python 3.12.


html_url: https://github.com/simonw/datasette-edit-schema/releases/tag/0.7.1
node_id: RE_kwDODsD4Ds4HoS6F
tag_name: 0.7.1
target_commitish: main
name: 0.7.1
created_at: 2023-11-04T21:20:31Z
published_at: 2023-11-04T21:22:04Z
updated_at: 2023-11-04T21:22:04Z
body:
  - Fixed a bug where editing a schema raised a 500 error if any of the table column names included a single quote. [#43](https://github.com/simonw/datasette-edit-schema/issues/43)


html_url: https://github.com/simonw/llm/releases/tag/0.11.2
node_id: RE_kwDOJRhX7M4HpFv5
tag_name: 0.11.2
target_commitish: main
name: 0.11.2
created_at: 2023-11-06T20:06:50Z
published_at: 2023-11-06T20:08:12Z
updated_at: 2023-11-06T20:08:12Z
body:
  - Pin to version of OpenAI Python library prior to 1.0 to avoid breaking. [#327](https://github.com/simonw/llm/issues/327)


html_url: https://github.com/simonw/llm/releases/tag/0.12
node_id: RE_kwDOJRhX7M4HpIfh
tag_name: 0.12
target_commitish: main
name: 0.12
created_at: 2023-11-06T21:32:09Z
published_at: 2023-11-06T21:33:20Z
updated_at: 2023-11-06T21:33:20Z
body:
  - Support for the [new GPT-4 Turbo model](https://openai.com/blog/new-models-and-developer-products-announced-at-devday) from OpenAI. Try it using `llm chat -m gpt-4-turbo` or `llm chat -m 4t`. [#323](https://github.com/simonw/llm/issues/323)
  - New `-o seed 1` option for OpenAI models which sets a seed that can attempt to evaluate the prompt deterministically. [#324](https://github.com/simonw/llm/issues/324)

reactions:
  {"url": "https://api.github.com/repos/simonw/llm/releases/128223201/reactions", "total_count": 3, "+1": 0, "-1": 0, "laugh": 0, "hooray": 3, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/datasette/datasette-enrichments/releases/tag/0.1a1
node_id: RE_kwDOG0Ywas4HvJfG
tag_name: 0.1a1
target_commitish: main
name: 0.1a1
created_at: 2023-11-16T17:32:10Z
published_at: 2023-11-16T17:38:55Z
updated_at: 2023-11-16T17:38:55Z
body:
  - Added `enrichments` permission, which is defaulted on for `root`. [#12](https://github.com/datasette/datasette-enrichments/issues/12)


html_url: https://github.com/datasette/datasette-enrichments/releases/tag/0.1a2
node_id: RE_kwDOG0Ywas4HvTG4
tag_name: 0.1a2
target_commitish: main
name: 0.1a2
created_at: 2023-11-16T20:39:23Z
published_at: 2023-11-16T20:40:44Z
updated_at: 2023-11-16T20:40:44Z
body:
  - Should now work with Datasette instances that have additional authentication plugins installed. [#13](https://github.com/datasette/datasette-enrichments/issues/13)


html_url: https://github.com/datasette/datasette-enrichments/releases/tag/0.1a3
node_id: RE_kwDOG0Ywas4Hvdvk
tag_name: 0.1a3
target_commitish: main
name: 0.1a3
created_at: 2023-11-17T05:05:08Z
published_at: 2023-11-17T05:06:47Z
updated_at: 2023-11-17T05:06:47Z
body:
  - `initialize()` and `enrich_batch()` methods now take an initial `datasette` argument. [#16](https://github.com/datasette/datasette-enrichments/issues/16)


html_url: https://github.com/datasette/datasette-enrichments/releases/tag/0.1a4
node_id: RE_kwDOG0Ywas4Hw3qe
tag_name: 0.1a4
target_commitish: main
name: 0.1a4
created_at: 2023-11-20T05:00:44Z
published_at: 2023-11-20T05:02:02Z
updated_at: 2023-11-20T05:02:02Z
body:
  - `config` now has `{"values": "like this"}` instead of `{"values": ["like this"]}`. [#18](https://github.com/datasette/datasette-enrichments/issues/18)


html_url: https://github.com/datasette/datasette-enrichments-jinja/releases/tag/0.1a1
node_id: RE_kwDOKuZiqs4Hw3tZ
tag_name: 0.1a1
target_commitish: main
name: 0.1a1
created_at: 2023-11-20T05:04:56Z
published_at: 2023-11-20T05:06:14Z
body:
  - Upgraded for compatibility with [datasette-enrichments 0.1a4](https://github.com/datasette/datasette-enrichments/releases/tag/0.1a4).


html_url: https://github.com/simonw/datasette-sentry/releases/tag/0.4
node_id: RE_kwDODh5N084HysKM
tag_name: 0.4
target_commitish: main
name: 0.4
created_at: 2023-11-21T19:20:42Z
published_at: 2023-11-21T19:22:42Z
body:
  - Added support for Sentry [Performance Monitoring](https://docs.sentry.io/product/performance/) with the new `"enable_tracing": true` setting. [#5](https://github.com/simonw/datasette-sentry/issues/5)


html_url: https://github.com/datasette/datasette-enrichments/releases/tag/0.1a5
node_id: RE_kwDOG0Ywas4H2Oda
tag_name: 0.1a5
target_commitish: main
name: 0.1a5
created_at: 2023-11-28T00:20:58Z
published_at: 2023-11-28T00:23:44Z
updated_at: 2023-11-28T00:23:44Z
body:
  - Initial documentation at https://enrichments.datasette.io/ [#21](https://github.com/datasette/datasette-enrichments/issues/21)
  - Fixed bug where form could not be displayed with validation errors.
  - Switched from acronyms to full names for the `status` column. [#20](https://github.com/datasette/datasette-enrichments/issues/20)
  - Status is set to `running` at start.
  - New `finalize()` method called when the job has finished. [#25](https://github.com/datasette/datasette-enrichments/issues/25)
  - New `{% above_form %}` and `{% below_form %}` blocks in the `enrichment.html` template to support easier customization within plugins, which can provide `enrichment-SLUG.html` templates.
  - `Enrichment` class is now an Abstract Base Class (ABC).


html_url: https://github.com/simonw/datasette-pretty-json/releases/tag/0.3
node_id: RE_kwDOCf9bl84H2uo7
tag_name: 0.3
target_commitish: master
name: 0.3
created_at: 2023-11-28T18:28:25Z
published_at: 2023-11-28T18:29:38Z
body:
  - Now renders with `white-space: pre-wrap` to avoid overly wide columns . [#4](https://github.com/simonw/datasette-pretty-json/issues/4)


html_url: https://github.com/datasette/datasette-enrichments/releases/tag/0.1a6
node_id: RE_kwDOG0Ywas4H2wIw
tag_name: 0.1a6
target_commitish: main
name: 0.1a6
created_at: 2023-11-28T06:45:11Z
published_at: 2023-11-28T19:17:21Z
updated_at: 2023-11-28T19:17:21Z
body:
  - Class methods in subclasses can now declare just the parameters that they intend to use. [#28](https://github.com/datasette/datasette-enrichments/issues/28)
  - `datasette` argument is now available to `get_config_form()`. [#22](https://github.com/datasette/datasette-enrichments/issues/22)
  - Now tested against Datasette 0.x as well as the Datasette 1.0 alpha series. [#29](https://github.com/datasette/datasette-enrichments/issues/29)


html_url: https://github.com/datasette/datasette-enrichments/releases/tag/0.1a7
node_id: RE_kwDOG0Ywas4H3b4h
tag_name: 0.1a7
target_commitish: main
name: 0.1a7
created_at: 2023-11-29T19:06:37Z
published_at: 2023-11-29T19:09:11Z
updated_at: 2023-11-29T19:09:11Z
body:
  - New error handling mechanism, with `_enrichment_errors` table and `log_error()` method. [#7](https://github.com/datasette/datasette-enrichments/issues/7)
  - Fix for bug where enrichments could not run against tables with `slashes/in/their/names`. [#14](https://github.com/datasette/datasette-enrichments/issues/14)
  - Neater pattern for writing tests for new enrichment plugins using the new `wait_for_job()` utility function. [#27](https://github.com/datasette/datasette-enrichments/issues/27)


html_url: https://github.com/datasette/datasette-enrichments/releases/tag/0.2
node_id: RE_kwDOG0Ywas4H3cFf
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2023-11-29T19:14:52Z
published_at: 2023-11-29T19:15:32Z
updated_at: 2023-11-29T19:15:32Z
body:
  - First non-alpha release of Datasette Enrichments. Documentation is at https://enrichments.datasette.io/


html_url: https://github.com/datasette/datasette-enrichments-opencage/releases/tag/0.1
node_id: RE_kwDOKx8XZs4H3pRS
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2023-11-30T05:28:45Z
published_at: 2023-11-30T05:30:24Z
updated_at: 2023-11-30T05:30:24Z
body:
  - Initial release. Provides the ability to geocode addresses and store latitude and longitude results. [#3](https://github.com/datasette/datasette-enrichments-opencage/issues/3)


html_url: https://github.com/datasette/datasette-enrichments-gpt/releases/tag/0.2
node_id: RE_kwDOKugxLc4H3pm2
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2023-11-30T05:51:36Z
published_at: 2023-11-30T05:53:20Z
body:
  - Option to force output to be JSON. [#3](https://github.com/datasette/datasette-enrichments-gpt/issues/3)
  - Now supports system prompts. [#4](https://github.com/datasette/datasette-enrichments-gpt/issues/4)
  - Now asks for an API key at runtime if one has not been configured. [#6](https://github.com/datasette/datasette-enrichments-gpt/issues/6)


html_url: https://github.com/datasette/datasette-comments/releases/tag/0.1.0
node_id: RE_kwDOKWkLkc4H4LFR
tag_name: 0.1.0
target_commitish: main
name: 0.1.0
created_at: 2023-11-30T18:22:48Z
published_at: 2023-11-30T18:24:20Z
updated_at: 2023-11-30T18:24:20Z
body:
  - Leave comments on specific rows inside your SQLite tables!
  - @ mention coworkers and teammates
  - React to other comments :heart: :+1:
  - Resolve threads when discussions finish


html_url: https://github.com/simonw/datasette-statistics/releases/tag/0.2.1
node_id: RE_kwDOGEJF-M4H4Urg
tag_name: 0.2.1
target_commitish: main
name: 0.2.1
created_at: 2023-11-30T23:34:29Z
published_at: 2023-11-30T23:34:58Z
body:
  - Now packaged using `pyproject.toml`. [#6](https://github.com/simonw/datasette-statistics/issues/6)


html_url: https://github.com/datasette/datasette-enrichments-gpt/releases/tag/0.3
node_id: RE_kwDOKugxLc4H44_b
tag_name: 0.3
target_commitish: main
name: 0.3
created_at: 2023-12-01T22:51:49Z
published_at: 2023-12-01T22:54:24Z
body:
  - Support for `gpt-4-turbo` and GPT Vision. See [Datasette Enrichments: a new plugin framework for augmenting your data](https://simonwillison.net/2023/Dec/1/datasette-enrichments/) for a video demo of the new features. [#2](https://github.com/datasette/datasette-enrichments-gpt/issues/2)


html_url: https://github.com/datasette/datasette-chronicle/releases/tag/0.1
node_id: RE_kwDOK2ToC84H6iIO
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2023-12-06T05:56:51Z
published_at: 2023-12-06T05:58:37Z
body:
  - Initial release. Adds table action menu options for enabling and disabling chronicle tracking for a table, using [sqlite-chronicle](https://github.com/simonw/sqlite-chronicle). [#1](https://github.com/datasette/datasette-chronicle/issues/1)


html_url: https://github.com/datasette/datasette-chronicle/releases/tag/0.2
node_id: RE_kwDOK2ToC84H7Fjw
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2023-12-06T21:59:26Z
published_at: 2023-12-06T22:00:51Z
body:
  - Table views with chronicle tracking enabled now support a `?_since=VERSION` parameter for viewing rows that have been inserted or updated since the specified version. [#2](https://github.com/datasette/datasette-chronicle/issues/2)
  - Fixed a bug where chronicle options were incorrectly shown in the table actions menu for SQL view pages.


html_url: https://github.com/simonw/datasette-leaflet-geojson/releases/tag/0.8.1
node_id: RE_kwDOCAwMN84H7spp
tag_name: 0.8.1
target_commitish: main
name: 0.8.1
created_at: 2023-12-07T20:48:24Z
published_at: 2023-12-07T20:54:37Z
body:
  - Tiny fix for compatibility with other JavaScript plugins. Thanks, Alex Garcia. [#22](https://github.com/simonw/datasette-leaflet-geojson/pull/22)


html_url: https://github.com/simonw/sqlite-utils/releases/tag/3.36
node_id: RE_kwDOCGYnMM4H7194
tag_name: 3.36
target_commitish: main
name: 3.36
created_at: 2023-12-08T05:31:03Z
published_at: 2023-12-08T05:32:21Z
updated_at: 2023-12-08T05:32:21Z
body:
  - Support for creating tables in [SQLite STRICT mode](https://www.sqlite.org/stricttables.html). Thanks, [Taj Khattra](https://github.com/tkhattra). ([#344](https://github.com/simonw/sqlite-utils/issues/344))
      - CLI commands `create-table`, `insert` and `upsert` all now accept a `--strict` option.
      - Python methods that can create a table - `table.create()` and `insert/upsert/insert_all/upsert_all` all now accept an optional `strict=True` parameter.
      - The `transform` command and `table.transform()` method preserve strict mode when transforming a table.
  - The `sqlite-utils create-table` command now accepts `str`, `int` and `bytes` as aliases for `text`, `integer` and `blob` respectively. ([#606](https://github.com/simonw/sqlite-utils/issues/606))

reactions:
  {"url": "https://api.github.com/repos/simonw/sqlite-utils/releases/133128056/reactions", "total_count": 2, "+1": 2, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/dogsheep/github-to-sqlite/releases/tag/2.9
node_id: RE_kwDODFdgUs4H8n-Z
tag_name: 2.9
target_commitish: main
name: 2.9
created_at: 2023-12-10T21:38:20Z
published_at: 2023-12-10T21:42:08Z
body:
  - New options for the `github-to-sqlite pull-requests`: `--org`, `--state` and `--search`. Thanks,  [Ned Batchelder](https://github.com/nedbat). [#80](https://github.com/dogsheep/github-to-sqlite/pull/80)
  - Fix for bug caused when a star refers to a now-removed repository. Thanks, [empjustine](https://github.com/empjustine). [#73](https://github.com/dogsheep/github-to-sqlite/pull/73)


html_url: https://github.com/datasette/datasette-sqlite-authorizer/releases/tag/0.1
node_id: RE_kwDOKWH3y84H_Osw
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2023-12-14T21:54:27Z
published_at: 2023-12-14T21:56:26Z
body:
  - Initial release. `read_only_tables` option can be used to specify read-only tables. [#3](https://github.com/datasette/datasette-sqlite-authorizer/issues/3)


html_url: https://github.com/simonw/django-sql-dashboard/releases/tag/1.2
node_id: RE_kwDOFLLS6s4H_1A2
tag_name: 1.2
target_commitish: main
name: 1.2
created_at: 2023-12-16T07:02:47Z
published_at: 2023-12-16T07:03:32Z
body:
  - New `/dashboard/name.json` export mechanism. Disable this with `DASHBOARD_DISABLE_JSON=True` in `settings.py`. [#157](https://github.com/simonw/django-sql-dashboard/issues/157)


html_url: https://github.com/datasette/datasette-plot/releases/tag/0.1.0
node_id: RE_kwDOKiitU84ICUD7
tag_name: 0.1.0
target_commitish: main
name: 0.1.0
created_at: 2023-12-21T19:08:09Z
published_at: 2023-12-21T19:10:34Z
updated_at: 2023-12-21T19:10:34Z
body:
  Initial release of `datasette-plot`, a Datasette plugin for building data visualizations with Observable Plot!

  - Builtin marks for scatterplots, line, bar, and linear regression plots
  - Use on table pages or SQL queries
  - Share links to visualizations with others


html_url: https://github.com/drkane/datasette-reconcile/releases/tag/v0.4.0
node_id: RE_kwDOEkwXEs4ICmk3
tag_name: v0.4.0
target_commitish: main
name: v0.4.0
created_at: 2023-12-22T12:32:50Z
published_at: 2023-12-22T12:36:29Z
body:
  ## What's Changed
  * Extend service by @nicokant in https://github.com/drkane/datasette-reconcile/pull/29

  ## New Contributors
  * @nicokant made their first contribution in https://github.com/drkane/datasette-reconcile/pull/29

  **Full Changelog**: https://github.com/drkane/datasette-reconcile/compare/v0.3.0...v0.4.0


html_url: https://github.com/drkane/datasette-reconcile/releases/tag/v0.4.1
node_id: RE_kwDOEkwXEs4ICmua
tag_name: v0.4.1
target_commitish: main
name: v0.4.1
created_at: 2023-12-22T12:41:12Z
published_at: 2023-12-22T12:42:35Z
body:
  Test publishing from github action. No substantial changes from v0.4.0

  **Full Changelog**: https://github.com/drkane/datasette-reconcile/compare/v0.4.0...v0.4.1


html_url: https://github.com/simonw/datasette/releases/tag/0.64.6
node_id: RE_kwDOBm6k_c4IC0Tt
tag_name: 0.64.6
target_commitish: 0.64.x
name: 0.64.6
created_at: 2023-12-22T23:16:28Z
published_at: 2023-12-22T23:19:30Z
updated_at: 2023-12-22T23:19:30Z
body:
  - Fixed a bug where CSV export with expanded labels could fail if a foreign key reference did not correctly resolve. ([#2214](https://github.com/simonw/datasette/issues/2214))

reactions:
  {"url": "https://api.github.com/repos/simonw/datasette/releases/134956269/reactions", "total_count": 3, "+1": 3, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/datasette-search-all/releases/tag/1.1.2
node_id: RE_kwDODqd5284IHsb2
tag_name: 1.1.2
target_commitish: main
name: 1.1.2
created_at: 2024-01-08T20:05:55Z
published_at: 2024-01-08T20:06:55Z
updated_at: 2024-01-08T20:06:55Z
body:
  - Upgraded for compatibility with the Datasette 1.0 alpha series. [#19](https://github.com/simonw/datasette-search-all/issues/19)


html_url: https://github.com/simonw/datasette-auth-tokens/releases/tag/0.4a5
node_id: RE_kwDOEDFIuM4II3Yx
tag_name: 0.4a5
target_commitish: main
name: 0.4a5
created_at: 2024-01-10T19:04:03Z
published_at: 2024-01-10T19:05:28Z
updated_at: 2024-01-10T19:05:28Z
body:
  - Actors on the token listing page are now displayed using the [actors_from_ids](https://docs.datasette.io/en/latest/internals.html#datasette-actors-from-ids) mechanism, if available. [#22](https://github.com/simonw/datasette-auth-tokens/issues/22)


html_url: https://github.com/simonw/datasette-auth-tokens/releases/tag/0.4a6
node_id: RE_kwDOEDFIuM4II4oM
tag_name: 0.4a6
target_commitish: main
name: 0.4a6
created_at: 2024-01-10T19:39:23Z
published_at: 2024-01-10T19:40:38Z
updated_at: 2024-01-10T19:40:38Z
body:
  - Fix for 500 bug if actors were not correctly returned. [#23](https://github.com/simonw/datasette-auth-tokens/issues/23)


html_url: https://github.com/simonw/datasette-cluster-map/releases/tag/0.18
node_id: RE_kwDOB8NBWs4IKUms
tag_name: 0.18
target_commitish: main
name: 0.18
created_at: 2024-01-13T06:48:03Z
published_at: 2024-01-13T06:50:38Z
body:
  - Now works with both Datasette 0.x and the Datasette 1.0 alphas. [#43](https://github.com/simonw/datasette-cluster-map/issues/43)
  - Previously the map only displayed automatically for tables with `latitude` and `longitude` columns. Now also detects `lat/lon`, `lat/lng`, `lat/long` and `something_latitude/something_longitude` wildcards. [#39](https://github.com/simonw/datasette-cluster-map/issues/39)


html_url: https://github.com/simonw/datasette-auth-tokens/releases/tag/0.4a7
node_id: RE_kwDOEDFIuM4IKcA_
tag_name: 0.4a7
target_commitish: main
name: 0.4a7
created_at: 2024-01-13T18:55:50Z
published_at: 2024-01-13T18:58:45Z
updated_at: 2024-01-13T18:58:45Z
body:
  - New `auth-tokens-create` permission governing whether users are allowed to create tokens. [#24](https://github.com/simonw/datasette-auth-tokens/issues/24)
  - New `auth-tokens-view-all` permission, granting users the ability to view tokens that they did not themselves create. [#19](https://github.com/simonw/datasette-auth-tokens/issues/19)
  - `auth-tokens-revoke-any` renamed to `auth-tokens-review-all`. [#29](https://github.com/simonw/datasette-auth-tokens/issues/29)


html_url: https://github.com/simonw/datasette-edit-templates/releases/tag/0.3
node_id: RE_kwDOEmnmRs4ILKZ7
tag_name: 0.3
target_commitish: main
name: 0.3
created_at: 2024-01-16T04:46:25Z
published_at: 2024-01-16T04:48:35Z
updated_at: 2024-01-16T04:48:35Z
body:
  - Ability to view previous revisions of an edited template. [#3](https://github.com/simonw/datasette-edit-templates/issues/3)
  - Ability to create a new template by name, e.g. for `pages/about.html`. [#7](https://github.com/simonw/datasette-edit-templates/issues/7)
  - Option to customize the text on the menu item. [#11](https://github.com/simonw/datasette-edit-templates/issues/11)
  - Option to disable the `prepare_jinja2_environment` plugin hook. [#12](https://github.com/simonw/datasette-edit-templates/issues/12)


html_url: https://github.com/simonw/datasette-edit-templates/releases/tag/0.4
node_id: RE_kwDOEmnmRs4ILK2S
tag_name: 0.4
target_commitish: main
name: 0.4
created_at: 2024-01-16T05:23:52Z
published_at: 2024-01-16T05:27:21Z
updated_at: 2024-01-16T05:27:21Z
body:
  - `"internal_db": true` option for use with Datasette 1.05a or higher. [#13](https://github.com/simonw/datasette-edit-templates/issues/13)


html_url: https://github.com/simonw/datasette-edit-templates/releases/tag/0.4.1
node_id: RE_kwDOEmnmRs4ILLHK
tag_name: 0.4.1
target_commitish: main
name: 0.4.1
created_at: 2024-01-16T05:47:06Z
published_at: 2024-01-16T05:48:39Z
updated_at: 2024-01-16T05:48:39Z
body:
  - Fix for compatibility with new `datasette.get_jinja_environment(request)`  method. [#14](https://github.com/simonw/datasette-edit-templates/issues/14)


html_url: https://github.com/simonw/datasette-edit-templates/releases/tag/0.4.2
node_id: RE_kwDOEmnmRs4ILzWK
tag_name: 0.4.2
target_commitish: main
name: 0.4.2
created_at: 2024-01-17T00:23:28Z
published_at: 2024-01-17T00:23:55Z
updated_at: 2024-01-17T00:23:55Z
body:
  - Fix for CodeMirror error against Datasette 1.0 alphas. [#15](https://github.com/simonw/datasette-edit-templates/issues/15)


html_url: https://github.com/simonw/datasette-edit-templates/releases/tag/0.4.3
node_id: RE_kwDOEmnmRs4ILzkt
tag_name: 0.4.3
target_commitish: main
name: 0.4.3
created_at: 2024-01-17T00:38:30Z
published_at: 2024-01-17T00:39:07Z
updated_at: 2024-01-17T00:39:07Z
body:
  - Fix bug where CodeMirror CSS was not correctly bundled with the package. [#17](https://github.com/simonw/datasette-edit-templates/issues/17)


html_url: https://github.com/datasette/datasette-proxy-url/releases/tag/0.1
node_id: RE_kwDOLIwk4M4IPS_x
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2024-01-23T20:28:55Z
published_at: 2024-01-23T20:29:29Z
body:
  - Initial release. Plugin configuration can specify paths that should proxy content from external URLs. [#1](https://github.com/datasette/datasette-proxy-url/issues/1)


html_url: https://github.com/simonw/llm/releases/tag/0.13
node_id: RE_kwDOJRhX7M4IRQRe
tag_name: 0.13
target_commitish: main
name: 0.13
created_at: 2024-01-26T22:32:23Z
published_at: 2024-01-26T22:34:39Z
updated_at: 2024-01-26T23:12:10Z
body:
  See also [LLM 0.13: The annotated release notes](https://simonwillison.net/2024/Jan/26/llm/).

  - Added support for new OpenAI embedding models: `3-small` and `3-large` and three variants of those with different dimension sizes, `3-small-512`, `3-large-256` and `3-large-1024`. See [OpenAI embedding models](https://llm.datasette.io/en/stable/openai-models.html#openai-models-embedding) for details. [#394](https://github.com/simonw/llm/issues/394)
  - The default `gpt-4-turbo` model alias now points to `gpt-4-turbo-preview`, which uses the most recent OpenAI GPT-4 turbo model (currently `gpt-4-0125-preview`). [#396](https://github.com/simonw/llm/issues/396)
  - New OpenAI model aliases `gpt-4-1106-preview` and `gpt-4-0125-preview`.
  - OpenAI models now support a `-o json_object 1` option which will cause their output to be returned as a valid JSON object. [#373](https://github.com/simonw/llm/issues/373)
  - New [plugins](https://llm.datasette.io/en/stable/plugins/directory.html#plugin-directory) since the last release include [llm-mistral](https://github.com/simonw/llm-mistral), [llm-gemini](https://github.com/simonw/llm-gemini), [llm-ollama](https://github.com/taketwo/llm-ollama) and [llm-bedrock-meta](https://github.com/flabat/llm-bedrock-meta).
  - The `keys.json` file for storing API keys is now created with `600` file permissions. [#351](https://github.com/simonw/llm/issues/351)
  - Documented [a pattern](https://llm.datasette.io/en/stable/setup.html#homebrew-warning) for installing plugins that depend on PyTorch using the Homebrew version of LLM, despite Homebrew using Python 3.12 when PyTorch have not yet released a stable package for that Python version. [#397](https://github.com/simonw/llm/issues/397)
  - Underlying OpenAI Python library has been upgraded to `>1.0`. It is possible this could cause compatibility issues with LLM plugins that also depend on that library. [#325](https://github.com/simonw/llm/issues/325)
  - Arrow keys now work inside the `llm chat` command. [#376](https://github.com/simonw/llm/issues/376)
  - `LLM_OPENAI_SHOW_RESPONSES=1` environment variable now outputs much more detailed information about the HTTP request and response made to OpenAI (and OpenAI-compatible) APIs. [#404](https://github.com/simonw/llm/issues/404)
  - Dropped support for Python 3.7.

reactions:
  {"url": "https://api.github.com/repos/simonw/llm/releases/138740830/reactions", "total_count": 2, "+1": 0, "-1": 0, "laugh": 0, "hooray": 1, "confused": 0, "heart": 1, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/llm/releases/tag/0.13.1
node_id: RE_kwDOJRhX7M4IRSEb
tag_name: 0.13.1
target_commitish: main
name: 0.13.1
created_at: 2024-01-27T00:24:58Z
published_at: 2024-01-27T00:28:55Z
updated_at: 2024-01-27T00:28:55Z
body:
  - Fix for `No module named 'readline'` error on Windows. [#407](https://github.com/simonw/llm/issues/407)


html_url: https://github.com/simonw/datasette-upload-csvs/releases/tag/0.9
node_id: RE_kwDODf8oPs4ISe7_
tag_name: 0.9
target_commitish: main
name: 0.9
created_at: 2024-01-30T06:17:32Z
published_at: 2024-01-30T06:20:11Z
updated_at: 2024-01-30T06:20:11Z
body:
  - User can now select which database to upload the CSV file to. This can also be accessed through the database action menu. [#28](https://github.com/simonw/datasette-upload-csvs/issues/28)
  - Switched to a new concurrency mechanism, where rows are inserted into the database in batches of 100. [#38](https://github.com/simonw/datasette-upload-csvs/issues/38)
  - Added compatibility with Datasette 1.0 alphas.


html_url: https://github.com/datasette/datasette-homepage-table/releases/tag/0.1
node_id: RE_kwDOLL5HMs4ITNzK
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2024-01-31T04:32:18Z
published_at: 2024-01-31T04:33:42Z
body:
  - Initial release. Configure this plugin to serve a specified table as the homepage of your Datasette instance. [#1](https://github.com/datasette/datasette-homepage-table/issues/1)


html_url: https://github.com/datasette/datasette-homepage-table/releases/tag/0.2
node_id: RE_kwDOLL5HMs4ITryR
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2024-01-31T18:49:20Z
published_at: 2024-01-31T18:50:48Z
body:
  - If Datasette instance has no tables at all, show the default homepage. [#2](https://github.com/datasette/datasette-homepage-table/issues/2)
  - Fixed a bug where the configured database was ignored if you failed to also provide a table.


html_url: https://github.com/simonw/shot-scraper/releases/tag/1.4
node_id: RE_kwDOG-A5W84IWEd9
tag_name: 1.4
target_commitish: main
name: 1.4
created_at: 2024-02-05T22:50:24Z
published_at: 2024-02-05T22:56:00Z
updated_at: 2024-02-05T22:56:00Z
body:
  - New `--auth-username x --auth-password y` options for each `shot-scraper` command, allowing a username and password to be set for HTTP Basic authentication. [#140](https://github.com/simonw/shot-scraper/issues/140)
  - `shot-scraper URL --interactive` mode now respects the `-w` and `-h` arguments setting the size of the browser viewport. Thanks, [mhalle](https://github.com/mhalle). [#128](https://github.com/simonw/shot-scraper/issues/128)
  - New `--scale-factor` option for setting scale factors other than 2 (for retina). Thanks, [Niel Thiart](https://github.com/nielthiart). [#136](https://github.com/simonw/shot-scraper/issues/136)
  - New `--browser-arg` option for passing extra browser arguments (such as `--browser-args "--font-render-hinting=none"`) through to the underlying browser. Thanks, [Niel Thiart](https://github.com/nielthiart). [#137](https://github.com/simonw/shot-scraper/issues/137)


html_url: https://github.com/simonw/datasette/releases/tag/1.0a8
node_id: RE_kwDOBm6k_c4IXdAZ
tag_name: 1.0a8
target_commitish: main
name: 1.0a8
created_at: 2024-02-07T16:34:05Z
published_at: 2024-02-07T16:37:33Z
updated_at: 2024-02-07T16:41:01Z
body:
  This alpha release continues the migration of Datasette's configuration from `metadata.yaml` to the new `datasette.yaml` configuration file, introduces a new system for JavaScript plugins and adds several new plugin hooks.

  See [Datasette 1.0a8: JavaScript plugins, new plugin hooks and plugin configuration in datasette.yaml](https://simonwillison.net/2024/Feb/7/datasette-1a8/) for an annotated version of these release notes.

  ### Configuration

  -   Plugin configuration now lives in the [datasette.yaml configuration file](https://docs.datasette.io/en/1.0a8/configuration.html#configuration), passed to Datasette using the `-c/--config` option. Thanks, Alex Garcia. ([#2093](https://github.com/simonw/datasette/issues/2093))
      ```bash
      datasette  -c  datasette.yaml
      ```
      Where `datasette.yaml` contains configuration that looks like this:
      ```yaml
      plugins:
        datasette-cluster-map:
          latitude_column: xlat
          longitude_column: xlon
      ```
  -   Previously plugins were configured in `metadata.yaml`, which was confusing as plugin settings were unrelated to database and table metadata.

  -   The `-s/--setting` option can now be used to set plugin configuration as well. See [Configuration via the command-line](https://docs.datasette.io/en/1.0a8/configuration.html#configuration-cli) for details. ([#2252](https://github.com/simonw/datasette/issues/2252))

      The above YAML configuration example using `-s/--setting` looks like this:
      ```bash
      datasette  mydatabase.db\
        -s  plugins.datasette-cluster-map.latitude_column  xlat\
        -s  plugins.datasette-cluster-map.longitude_column  xlon
      ```
  -   The new `/-/config` page shows the current instance configuration, after redacting keys that could contain sensitive data such as API keys or passwords. ([#2254](https://github.com/simonw/datasette/issues/2254))

  -   Existing Datasette installations may already have configuration set in `metadata.yaml` that should be migrated to `datasette.yaml`. To avoid breaking these installations, Datasette will silently treat table configuration, plugin configuration and allow blocks in metadata as if they had been specified in configuration instead. ([#2247](https://github.com/simonw/datasette/issues/2247)) ([#2248](https://github.com/simonw/datasette/issues/2248)) ([#2249](https://github.com/simonw/datasette/issues/2249))

  Note that the `datasette publish` command has not yet been updated to accept a `datasette.yaml` configuration file. This will be addressed in [#2195](https://github.com/simonw/datasette/issues/2195) but for the moment you can include those settings in `metadata.yaml` instead.

  ### JavaScript plugins

  Datasette now includes a [JavaScript plugins mechanism](https://docs.datasette.io/en/1.0a8/javascript_plugins.html#javascript-plugins), allowing JavaScript to customize Datasette in a way that can collaborate with other plugins.

  This provides two initial hooks, with more to come in the future:

  -   [makeAboveTablePanelConfigs()](https://docs.datasette.io/en/1.0a8/javascript_plugins.html#javascript-plugins-makeabovetablepanelconfigs) can add additional panels to the top of the table page.

  -   [makeColumnActions()](https://docs.datasette.io/en/1.0a8/javascript_plugins.html#javascript-plugins-makecolumnactions) can add additional actions to the column menu.

  Thanks [Cameron Yick](https://github.com/hydrosquall) for contributing this feature. ([#2052](https://github.com/simonw/datasette/pull/2052))

  ### Plugin hooks

  -   New [jinja2_environment_from_request(datasette, request, env)](https://docs.datasette.io/en/1.0a8/plugin_hooks.html#plugin-hook-jinja2-environment-from-request) plugin hook, which can be used to customize the current Jinja environment based on the incoming request. This can be used to modify the template lookup path based on the incoming request hostname, among other things. ([#2225](https://github.com/simonw/datasette/issues/2225))

  -   New [family of template slot plugin hooks](https://docs.datasette.io/en/1.0a8/plugin_hooks.html#plugin-hook-slots): `top_homepage`, `top_database`, `top_table`, `top_row`, `top_query`, `top_canned_query`. Plugins can use these to provide additional HTML to be injected at the top of the corresponding pages. ([#1191](https://github.com/simonw/datasette/issues/1191))

  -   New [track_event() mechanism](https://docs.datasette.io/en/1.0a8/plugin_hooks.html#plugin-event-tracking) for plugins to emit and receive events when certain events occur within Datasette. ([#2240](https://github.com/simonw/datasette/issues/2240))

      -   Plugins can register additional event classes using [register_events(datasette)](https://docs.datasette.io/en/1.0a8/plugin_hooks.html#plugin-hook-register-events).

      -   They can then trigger those events with the [datasette.track_event(event)](https://docs.datasette.io/en/1.0a8/internals.html#datasette-track-event) internal method.

      -   Plugins can subscribe to notifications of events using the [track_event(datasette, event)](https://docs.datasette.io/en/1.0a8/plugin_hooks.html#plugin-hook-track-event) plugin hook.

      -   Datasette core now emits `login`, `logout`, `create-token`, `create-table`, `drop-table`, `insert-rows`, `upsert-rows`, `update-row`, `delete-row` events, [documented here](https://docs.datasette.io/en/1.0a8/events.html#events).

  -   New internal function for plugin authors: [await db.execute_isolated_fn(fn)](https://docs.datasette.io/en/1.0a8/internals.html#database-execute-isolated-fn), for creating a new SQLite connection, executing code and then closing that connection, all while preventing other code from writing to that particular database. This connection will not have the [prepare_connection()](https://docs.datasette.io/en/1.0a8/plugin_hooks.html#plugin-hook-prepare-connection) plugin hook executed against it, allowing plugins to perform actions that might otherwise be blocked by existing connection configuration. ([#2218](https://github.com/simonw/datasette/issues/2218))

  ### Documentation

  -   Documentation describing [how to write tests that use signed actor cookies](https://docs.datasette.io/en/1.0a8/testing_plugins.html#testing-datasette-client) using `datasette.client.actor_cookie()`. ([#1830](https://github.com/simonw/datasette/issues/1830))

  -   Documentation on how to [register a plugin for the duration of a test](https://docs.datasette.io/en/1.0a8/testing_plugins.html#testing-plugins-register-in-test). ([#2234](https://github.com/simonw/datasette/issues/2234))

  -   The [configuration documentation](https://docs.datasette.io/en/1.0a8/configuration.html#configuration) now shows examples of both YAML and JSON for each setting.

  ### Minor fixes

  -   Datasette no longer attempts to run SQL queries in parallel when rendering a table page, as this was leading to some rare crashing bugs. ([#2189](https://github.com/simonw/datasette/issues/2189))

  -   Fixed warning: `DeprecationWarning: pkg_resources is deprecated as an API` ([#2057](https://github.com/simonw/datasette/issues/2057))

  -   Fixed bug where `?_extra=columns` parameter returned an incorrectly shaped response. ([#2230](https://github.com/simonw/datasette/issues/2230))


html_url: https://github.com/datasette/datasette-events-db/releases/tag/0.1a0
node_id: RE_kwDOLMquvc4IYefD
tag_name: 0.1a0
target_commitish: main
name: 0.1a0
created_at: 2024-02-08T17:31:25Z
published_at: 2024-02-08T17:32:46Z
updated_at: 2024-02-08T17:32:46Z
body:
  - Initial plugin. Logs all events to a `datasette_events` table. [#1](https://github.com/datasette/datasette-events-db/issues/1)


html_url: https://github.com/datasette/datasette-enrichments-quickjs/releases/tag/0.1a0
node_id: RE_kwDOLQOkP84IaOO9
tag_name: 0.1a0
target_commitish: main
name: 0.1a0
created_at: 2024-02-09T17:29:26Z
published_at: 2024-02-09T17:30:07Z
body:
  - Initial release. Enrich data using a custom JavaScript function. [#1](https://github.com/datasette/datasette-enrichments-quickjs/issues/1)


html_url: https://github.com/simonw/datasette-auth-tokens/releases/tag/0.4a8
node_id: RE_kwDOEDFIuM4IdVMP
tag_name: 0.4a8
target_commitish: main
name: 0.4a8
created_at: 2024-02-14T00:18:46Z
published_at: 2024-02-14T00:21:16Z
updated_at: 2024-02-14T00:21:16Z
body:
  - Fix for intermittent `database is locked` bug in managed tokens mode. [#30](https://github.com/simonw/datasette-auth-tokens/issues/30)


html_url: https://github.com/datasette/datasette-enrichments-opencage/releases/tag/0.1.1
node_id: RE_kwDOKx8XZs4IesaD
tag_name: 0.1.1
target_commitish: main
name: 0.1.1
created_at: 2024-02-16T03:30:43Z
published_at: 2024-02-16T03:31:34Z
updated_at: 2024-02-16T03:31:34Z
body:
  - Run insert SQL queries inside a transaction. [#5](https://github.com/datasette/datasette-enrichments-opencage/issues/5)


html_url: https://github.com/simonw/datasette/releases/tag/1.0a9
node_id: RE_kwDOBm6k_c4IfSUo
tag_name: 1.0a9
target_commitish: main
name: 1.0a9
created_at: 2024-02-16T22:36:12Z
published_at: 2024-02-16T22:39:38Z
updated_at: 2024-02-16T22:39:38Z
body:
  This alpha release adds basic alter table support to the Datasette Write API and fixes a permissions bug relating to the `/upsert` API endpoint.

  ### Alter table support for create, insert, upsert and update

  The [JSON write API](https://docs.datasette.io/en/latest/json_api.html#json-api-write) can now be used to apply simple alter table schema changes, provided the acting actor has the new [alter-table](https://docs.datasette.io/en/latest/authentication.html#permissions-alter-table) permission. ([#2101](https://github.com/simonw/datasette/issues/2101))

  The only alter operation supported so far is adding new columns to an existing table.

  - The [/db/-/create](https://docs.datasette.io/en/latest/json_api.html#tablecreateview) API now adds new columns during large operations to create a table based on incoming example `"rows"`, in the case where one of the later rows includes columns that were not present in the earlier batches. This requires the `create-table` but not the `alter-table` permission.
  - When `/db/-/create` is called with rows in a situation where the table may have been already created, an `"alter": true` key can be included to indicate that any missing columns from the new rows should be added to the table. This requires the `alter-table` permission.
  - [/db/table/-/insert](https://docs.datasette.io/en/latest/json_api.html#tableinsertview) and [/db/table/-/upsert](https://docs.datasette.io/en/latest/json_api.html#tableupsertview) and [/db/table/row-pks/-/update](https://docs.datasette.io/en/latest/json_api.html#rowupdateview) all now also accept `"alter": true`, depending on the `alter-table` permission.

  Operations that alter a table now fire the new [alter-table event](https://docs.datasette.io/en/latest/events.html#events).

  ### Permissions fix for the upsert API

  The [/database/table/-/upsert API](https://docs.datasette.io/en/latest/json_api.html#tableupsertview) had a minor permissions bug, only affecting Datasette instances that had configured the `insert-row` and `update-row` permissions to apply to a specific table rather than the database or instance as a whole. Full details in issue [#2262](https://github.com/simonw/datasette/issues/2262).

  To avoid similar mistakes in the future the [datasette.permission_allowed()](https://docs.datasette.io/en/latest/internals.html#datasette-permission-allowed) method now specifies `default=` as a keyword-only argument.

  ### Permission checks now consider opinions from every plugin

  The [datasette.permission_allowed()](https://docs.datasette.io/en/latest/internals.html#datasette-permission-allowed) method previously consulted every plugin that implemented the [permission_allowed()](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-permission-allowed) plugin hook and obeyed the opinion of the last plugin to return a value. ([#2275](https://github.com/simonw/datasette/issues/2275))

  Datasette now consults every plugin and checks to see if any of them returned `False` (the veto rule), and if none of them did, it then checks to see if any of them returned `True`.

  This is explained at length in the new documentation covering [How permissions are resolved](https://docs.datasette.io/en/latest/authentication.html#authentication-permissions-explained).

  ### Other changes

  - The new [DATASETTE_TRACE_PLUGINS=1 environment variable](https://docs.datasette.io/en/latest/writing_plugins.html#writing-plugins-tracing) turns on detailed trace output for every executed plugin hook, useful for debugging and understanding how the plugin system works at a low level. ([#2274](https://github.com/simonw/datasette/issues/2274))
  - Datasette on Python 3.9 or above marks its non-cryptographic uses of the MD5 hash function as `usedforsecurity=False`, for compatibility with FIPS systems. ([#2270](https://github.com/simonw/datasette/issues/2270))
  - SQL relating to [Datasette's internal database](https://docs.datasette.io/en/latest/internals.html#internals-internal) now executes inside a transaction, avoiding a potential database locked error. ([#2273](https://github.com/simonw/datasette/issues/2273))
  - The `/-/threads` debug page now identifies the database in the name associated with each dedicated write thread. ([#2265](https://github.com/simonw/datasette/issues/2265))
  - The `/db/-/create` API now fires a `insert-rows` event if rows were inserted after the table was created. ([#2260](https://github.com/simonw/datasette/issues/2260))


html_url: https://github.com/simonw/datasette/releases/tag/1.0a10
node_id: RE_kwDOBm6k_c4Ifh6H
tag_name: 1.0a10
target_commitish: main
name: 1.0a10
created_at: 2024-02-18T05:03:41Z
published_at: 2024-02-18T05:04:08Z
updated_at: 2024-02-18T05:04:08Z
body:
  The only changes in this alpha correspond to the way Datasette handles database transactions. ([#2277](https://github.com/simonw/datasette/issues/2277))

  - The [database.execute_write_fn()](https://docs.datasette.io/en/latest/internals.html#database-execute-write-fn) method has a new `transaction=True` parameter. This defaults to `True` which means all functions executed using this method are now automatically wrapped in a transaction - previously the functions needed to roll transaction handling on their own, and many did not.
  - Pass `transaction=False` to `execute_write_fn()` if you want to manually handle transactions in your function.
  - Several internal Datasette features, including parts of the [JSON write API](https://docs.datasette.io/en/latest/json_api.html#json-api-write), had been failing to wrap their operations in a transaction. This has been fixed by the new `transaction=True` default.


html_url: https://github.com/datasette/datasette-unsafe-actor-debug/releases/tag/0.1
node_id: RE_kwDOLUUhXs4IfoCc
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2024-02-18T19:14:36Z
published_at: 2024-02-18T19:18:45Z
body:
  - Initial plugin. Adds a `/-/unsafe-actor` debug page for imitating any actor. [#1](https://github.com/datasette/datasette-unsafe-actor-debug/issues/1)


html_url: https://github.com/datasette/datasette-unsafe-actor-debug/releases/tag/0.2
node_id: RE_kwDOLUUhXs4Ifoca
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2024-02-18T20:17:57Z
published_at: 2024-02-18T20:20:13Z
body:
  - Plugin is now disabled unless you explicitly configure it. [#2](https://github.com/datasette/datasette-unsafe-actor-debug/issues/3)

    Use this in your settings:
    ```yaml
    plugins:
      datasette-unsafe-actor-debug:
        enabled: true
    ```
    Or with Datasette 1.0 alpha start `datasette` with the following:
    ```bash
     datasette -s plugins.datasette-unsafe-actor-debug.enabled 1
    ```
  - If enabled, the plugin now adds a link to the debug tool in the Datasette navigation menu. [#3](https://github.com/datasette/datasette-unsafe-actor-debug/issues/3)


html_url: https://github.com/simonw/datasette-edit-schema/releases/tag/0.8a0
node_id: RE_kwDODsD4Ds4Ifpbx
tag_name: 0.8a0
target_commitish: main
name: 0.8a0
created_at: 2024-02-18T22:16:16Z
published_at: 2024-02-18T22:20:34Z
updated_at: 2024-02-18T22:20:34Z
body:
  This release introduces support for finely grained per-database and per-table permissions, plus integration with the new [Datasette Events](https://docs.datasette.io/en/latest/events.html) mechanism added in Datasette 1.0a8.

  - This release requires Datasette 1.0a9 or higher.
  - Finely grained permissions: the `edit-schema` permission is still supported, but you can also control access to this plugin using the `create-table`, `drop-table` and `alter-table` permissions from Datasette core. These can be used to control access on a per-table and per-database level. [#22](https://github.com/simonw/datasette-edit-schema/issues/22), [#55](https://github.com/simonw/datasette-edit-schema/issues/55)
  - Now tracks `create-table`, `alter-table` and `drop-table` events using the new [Datasette Events](https://docs.datasette.io/en/latest/events.html) system introduced in Datasette 1.0a8. [#50](https://github.com/simonw/datasette-edit-schema/issues/50)
  - Primary keys can now also be set as foreign keys, useful for many-to-many relationship tables. [#52](https://github.com/simonw/datasette-edit-schema/issues/52)
  - Now runs `VACUUM` using `db.execute_isolated_fn()` to avoid being caught out by any connection permission handlers. [#47](https://github.com/simonw/datasette-edit-schema/issues/47)
  - Tightened up display on mobile screens. [#45](https://github.com/simonw/datasette-edit-schema/issues/45)
  - Fixed a bug where the SQL schema for a table was not shown correctly on the edit schema page. [#49](https://github.com/simonw/datasette-edit-schema/issues/49)
  - Fixed a 500 error if a table only consists of primary keys. [#51](https://github.com/simonw/datasette-edit-schema/issues/51)


html_url: https://github.com/simonw/datasette/releases/tag/1.0a11
node_id: RE_kwDOBm6k_c4IgRI9
tag_name: 1.0a11
target_commitish: main
name: 1.0a11
created_at: 2024-02-19T22:48:37Z
published_at: 2024-02-19T22:52:29Z
updated_at: 2024-02-19T22:52:29Z
body:
  - The `"replace": true` argument to the `/db/table/-/insert` API now requires the actor to have the `update-row` permission. ([#2279](https://github.com/simonw/datasette/issues/2279))
  - Fixed some UI bugs in the interactive permissions debugging tool. ([#2278](https://github.com/simonw/datasette/issues/2278))
  - The column action menu now aligns better with the cog icon, and positions itself taking into account the width of the browser window. ([#2263](https://github.com/simonw/datasette/issues/2263))


html_url: https://github.com/simonw/datasette-auth-tokens/releases/tag/0.4a9
node_id: RE_kwDOEDFIuM4IgzVZ
tag_name: 0.4a9
target_commitish: main
name: 0.4a9
created_at: 2024-02-20T16:35:05Z
published_at: 2024-02-20T16:36:43Z
updated_at: 2024-02-20T16:36:43Z
body:
  - Fixed a bug where the heading "Specific tables in specific databases" showed even for databases with no tables. [#32](https://github.com/simonw/datasette-auth-tokens/issues/32)


html_url: https://github.com/datasette/datasette-events-forward/releases/tag/0.1a0
node_id: RE_kwDOLU-JCc4Ig7dT
tag_name: 0.1a0
target_commitish: main
name: 0.1a0
created_at: 2024-02-20T19:46:16Z
published_at: 2024-02-20T19:47:29Z
updated_at: 2024-02-20T19:47:29Z
body:
  - Initial implementation. Forwards tracked events to another Datasette instance via the JSON Write API. [#1](https://github.com/datasette/datasette-events-forward/issues/1)


html_url: https://github.com/datasette/datasette-events-forward/releases/tag/0.1a1
node_id: RE_kwDOLU-JCc4Ig_vV
tag_name: 0.1a1
target_commitish: main
name: 0.1a1
created_at: 2024-02-20T21:53:37Z
published_at: 2024-02-20T21:54:53Z
updated_at: 2024-02-20T21:54:53Z
body:
  - Silently ignore events if `api_url` has not been configured, rather than accumulating them in the `datasette_events_to_forward` table. [#2](https://github.com/datasette/datasette-events-forward/issues/2)
  - Events are now deleted from `datasette_events_to_forward` as soon as they have been delivired. [#3](https://github.com/datasette/datasette-events-forward/issues/3)


html_url: https://github.com/simonw/datasette-write/releases/tag/0.3
node_id: RE_kwDOEG8FFs4Ik6Wb
tag_name: 0.3
target_commitish: main
name: 0.3
created_at: 2024-02-27T22:46:46Z
published_at: 2024-02-27T22:48:50Z
updated_at: 2024-02-27T22:48:50Z
body:
  - Can now be used with parameterized queries, which get converted into form fields - `insert into foo (name) values (:name)` for example. Parameters ending in `_textarea` will be rendered as multi-line textareas. [#7](https://github.com/simonw/datasette-write/issues/7)
  - Fix for cosmetic bug when installed alongside `datasette-template-sql`. [#6](https://github.com/simonw/datasette-write/issues/6)


html_url: https://github.com/simonw/datasette-explain/releases/tag/0.2
node_id: RE_kwDOI7mujs4IldY2
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2024-02-28T16:35:06Z
published_at: 2024-02-28T16:35:44Z
body:
  - Fixed a bug where `explain` queries showed an error because you can't explain an explain. [#5](https://github.com/simonw/datasette-explain/issues/5)


html_url: https://github.com/simonw/datasette-explain/releases/tag/0.2.1
node_id: RE_kwDOI7mujs4IlePH
tag_name: 0.2.1
target_commitish: main
name: 0.2.1
created_at: 2024-02-28T16:52:45Z
published_at: 2024-02-28T16:55:58Z
body:
  - Now tested against both Datasette 0.64.x and the Datasette 1.0 alphas
  - README includes a screenshot and a link to [a demo](https://datasette.simonwillison.net/simonwillisonblog?sql=select%0D%0A++blog_tag.tag%2C%0D%0A++blog_blogmark.link_title%2C%0D%0A++blog_blogmark.link_url%0D%0Afrom%0D%0A++blog_blogmark_tags%0D%0A++join+blog_tag+on+tag_id+%3D+blog_tag.id%0D%0A++join+blog_blogmark+on+blog_blogmark_tags.blogmark_id+%3D+blog_blogmark.id%0D%0Aorder+by+blog_blogmark.id+desc)
  - Switched from `setup.py` to `pyproject.toml`


html_url: https://github.com/simonw/datasette-scale-to-zero/releases/tag/0.3
node_id: RE_kwDOHilbp84ImVjb
tag_name: 0.3
target_commitish: main
name: 0.3
created_at: 2024-02-29T20:24:08Z
published_at: 2024-02-29T20:26:00Z
updated_at: 2024-02-29T20:26:00Z
body:
  - New mechanism for optionally sending an HTTP request when the server shuts down, controlled by the configuration options `shutdown_url` and `shutdown_method` and `shutdown_headers` and `shutdown_body`. [#5](https://github.com/simonw/datasette-scale-to-zero/issues/5)
  - Renamed `max-age` to `max_age` (though the old name still works). [#6](https://github.com/simonw/datasette-scale-to-zero/issues/6)


html_url: https://github.com/simonw/datasette-scale-to-zero/releases/tag/0.3.1
node_id: RE_kwDOHilbp84ImX7Z
tag_name: 0.3.1
target_commitish: main
name: 0.3.1
created_at: 2024-02-29T21:22:46Z
published_at: 2024-02-29T21:23:49Z
updated_at: 2024-02-29T21:23:49Z
body:
  - Loosened validation requirements for `"shutdown_url"` to support configuring it via an environment variable that might be blank. [#7](https://github.com/simonw/datasette-scale-to-zero/issues/7)


html_url: https://github.com/simonw/datasette/releases/tag/1.0a12
node_id: RE_kwDOBm6k_c4ImZzM
tag_name: 1.0a12
target_commitish: main
name: 1.0a12
created_at: 2024-02-29T22:35:28Z
published_at: 2024-02-29T22:36:42Z
updated_at: 2024-02-29T22:36:42Z
body:
  - New [query_actions()](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-query-actions) plugin hook, similar to [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). Can be used to add a menu of actions to the canned query or arbitrary SQL query page. ([#2283](https://github.com/simonw/datasette/issues/2283))
  - New design for the button that opens the query, table and database actions menu. ([#2281](https://github.com/simonw/datasette/issues/2281))
  - "does not contain" table filter for finding rows that do not contain a string. ([#2287](https://github.com/simonw/datasette/issues/2287))
  - Fixed a bug in the [makeColumnActions(columnDetails)](https://docs.datasette.io/en/latest/javascript_plugins.html#javascript-plugins-makecolumnactions) JavaScript plugin mechanism where the column action menu was not fully reset in between each interaction. ([#2289](https://github.com/simonw/datasette/issues/2289))

reactions:
  {"url": "https://api.github.com/repos/simonw/datasette/releases/144284876/reactions", "total_count": 1, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 1, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/datasette-schema-versions/releases/tag/0.3
node_id: RE_kwDOETQkBs4Imeci
tag_name: 0.3
target_commitish: main
name: 0.3
created_at: 2024-03-01T02:43:23Z
published_at: 2024-03-01T02:43:49Z
body:
  - Now includes the schema version of the `_internal` database, including on Datasette 1.0 alpha. [#4](https://github.com/simonw/datasette-schema-versions/issues/4)


html_url: https://github.com/datasette/datasette-column-sum/releases/tag/0.1a0
node_id: RE_kwDOLZ-KRM4ImgH3
tag_name: 0.1a0
target_commitish: main
name: 0.1a0
created_at: 2024-03-01T04:09:08Z
published_at: 2024-03-01T04:12:55Z
updated_at: 2024-03-01T04:12:55Z
body:
  - Initial prototype. Adds column menu options for calculating sums of numeric columns, and group by sums against text columns. [#1](https://github.com/datasette/datasette-column-sum/issues/1)


html_url: https://github.com/datasette/datasette-tail/releases/tag/0.1a0
node_id: RE_kwDOLaT5G84Im1Jq
tag_name: 0.1a0
target_commitish: main
name: 0.1a0
created_at: 2024-03-01T16:24:52Z
published_at: 2024-03-01T16:25:48Z
updated_at: 2024-03-01T16:25:48Z
body:
  - Initial plugin. Adds a `/database/-/tail` debugging endpoint that you can poll to see changes to a database. [#1](https://github.com/datasette/datasette-tail/issues/1)


html_url: https://github.com/simonw/datasette-expose-env/releases/tag/0.2
node_id: RE_kwDOHmgSA84InSvq
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2024-03-03T00:05:45Z
published_at: 2024-03-03T00:06:22Z
body:
  - New `show_all_redacted: true` setting for displaying a redacted list of all of the other environment variables. [#2](https://github.com/simonw/datasette-expose-env/issues/2)


html_url: https://github.com/datasette/datasette-sqlite-debug-authorizer/releases/tag/0.1.1
node_id: RE_kwDOKVzq2s4IoQpH
tag_name: 0.1.1
target_commitish: main
name: 0.1.1
created_at: 2024-03-05T00:42:07Z
published_at: 2024-03-05T00:43:50Z
body:
  - Fixed a bug with Python 3.11 and Python 3.12. [#2](https://github.com/datasette/datasette-sqlite-debug-authorizer/issues/2)


html_url: https://github.com/datasette/datasette-sqlite-authorizer/releases/tag/0.2
node_id: RE_kwDOKWH3y84IoRE6
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2024-03-05T01:07:14Z
published_at: 2024-03-05T01:09:05Z
body:
  - `debug_actions` configuration option for printing debug information to standard error when an action is authorized or denied. [#5](https://github.com/datasette/datasette-sqlite-authorizer/issues/5)


html_url: https://github.com/datasette/datasette-uptime/releases/tag/0.1
node_id: RE_kwDOLcU1eM4IpFXu
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2024-03-06T05:09:44Z
published_at: 2024-03-06T05:12:21Z
body:
  - Initial release. Adds a JSON endpoint at `/-/uptime` returning server uptime information. [#1](https://github.com/datasette/datasette-uptime/issues/1)


html_url: https://github.com/simonw/pypi-to-sqlite/releases/tag/0.2.3
node_id: RE_kwDOHI-jK84IpGVQ
tag_name: 0.2.3
target_commitish: main
name: 0.2.3
created_at: 2024-03-06T06:15:31Z
published_at: 2024-03-06T06:16:31Z
body:
  - Fix bug caused by PyPI JSON shape changing. [#8](https://github.com/simonw/pypi-to-sqlite/issues/8)


html_url: https://github.com/datasette/datasette-create-view/releases/tag/0.1
node_id: RE_kwDOLc0adM4Ip0aE
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2024-03-07T04:19:16Z
published_at: 2024-03-07T04:26:31Z
updated_at: 2024-03-07T04:26:31Z
body:
  - Adds a query action menu option for saving a SQL query as a view. [#1](https://github.com/datasette/datasette-create-view/issues/1)


html_url: https://github.com/simonw/datasette-saved-queries/releases/tag/0.2.2
node_id: RE_kwDOEE70l84IqLln
tag_name: 0.2.2
target_commitish: main
name: 0.2.2
created_at: 2024-03-07T14:32:16Z
published_at: 2024-03-07T14:33:33Z
body:
  - Prevent queries from being created with a `null` name. [#11](https://github.com/simonw/datasette-saved-queries/issues/11)


html_url: https://github.com/datasette/datasette-extract/releases/tag/0.1a1
node_id: RE_kwDOKHgxRM4IqfPc
tag_name: 0.1a1
target_commitish: main
name: 0.1a1
created_at: 2024-03-07T21:28:13Z
published_at: 2024-03-07T21:28:53Z
updated_at: 2024-03-07T21:28:53Z
body:
  - Fixed bug where content without images failed to process. [#14](https://github.com/datasette/datasette-extract/issues/14)


html_url: https://github.com/datasette/datasette-extract/releases/tag/0.1a2
node_id: RE_kwDOKHgxRM4Iqgpb
tag_name: 0.1a2
target_commitish: main
name: 0.1a2
created_at: 2024-03-07T22:16:58Z
published_at: 2024-03-07T22:17:28Z
updated_at: 2024-03-07T22:17:28Z
body:
  - Single drop zone for all types of upload - text files, images and HEIC images. [#16](https://github.com/datasette/datasette-extract/issues/16)


html_url: https://github.com/datasette/datasette-enrichments-quickjs/releases/tag/0.1a1
node_id: RE_kwDOLQOkP84IrihQ
tag_name: 0.1a1
target_commitish: main
name: 0.1a1
created_at: 2024-03-09T14:55:39Z
published_at: 2024-03-09T14:56:16Z
body:
  - QuickJS functions now run with a 4MB memory limit, avoiding potential crashes if code tries to allocate too much memory. [#4](https://github.com/datasette/datasette-enrichments-quickjs/issues/4)


html_url: https://github.com/simonw/datasette/releases/tag/1.0a13
node_id: RE_kwDOBm6k_c4Itn5A
tag_name: 1.0a13
target_commitish: main
name: 1.0a13
created_at: 2024-03-13T02:10:53Z
published_at: 2024-03-13T02:14:36Z
updated_at: 2024-03-14T02:27:35Z
body:
  Each of the key concepts in Datasette now has an [actions menu](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-actions), which plugins can use to add additional functionality targeting that entity.

  -   Plugin hook: [view_actions()](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-view-actions) for actions that can be applied to a SQL view. ([#2297](https://github.com/simonw/datasette/issues/2297))
  -   Plugin hook: [homepage_actions()](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-homepage-actions) for actions that apply to the instance homepage. ([#2298](https://github.com/simonw/datasette/issues/2298))
  -   Plugin hook: [row_actions()](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-row-actions) for actions that apply to the row page. ([#2299](https://github.com/simonw/datasette/issues/2299))
  -   Action menu items for all of the `*_actions()` plugin hooks can now return an optional `"description"` key, which will be displayed in the menu below the action label. ([#2294](https://github.com/simonw/datasette/issues/2294))
  -   [Plugin hooks](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hooks) documentation page is now organized with additional headings. ([#2300](https://github.com/simonw/datasette/issues/2300))
  -   Improved the display of action buttons on pages that also display metadata. ([#2286](https://github.com/simonw/datasette/issues/2286))
  -   The header and footer of the page now uses a subtle gradient effect, and options in the navigation menu are better visually defined. ([#2302](https://github.com/simonw/datasette/issues/2302))
  -   Table names that start with an underscore now default to hidden. ([#2104](https://github.com/simonw/datasette/issues/2104))
  -   `pragma_table_list` has been added to the allow-list of SQLite pragma functions supported by Datasette. `select * from pragma_table_list()` is no longer blocked. ([#2104](https://github.com/simonw/datasette/issues/2104#issuecomment-1982352475))

reactions:
  {"url": "https://api.github.com/repos/simonw/datasette/releases/146177600/reactions", "total_count": 3, "+1": 2, "-1": 0, "laugh": 1, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/datasette/datasette-extract/releases/tag/0.1a3
node_id: RE_kwDOKHgxRM4IuSNY
tag_name: 0.1a3
target_commitish: main
name: 0.1a3
created_at: 2024-03-13T15:32:31Z
published_at: 2024-03-13T15:33:38Z
updated_at: 2024-03-13T15:33:38Z
body:
  - Extraction jobs can now provide additional instructions to pass to the model, which are persisted and suggested for reuse when data is imported into the table in the future. [#17](https://github.com/datasette/datasette-extract/issues/17)


html_url: https://github.com/simonw/datasette-edit-schema/releases/tag/0.8a1
node_id: RE_kwDODsD4Ds4IutrK
tag_name: 0.8a1
target_commitish: main
name: 0.8a1
created_at: 2024-03-14T02:29:34Z
published_at: 2024-03-14T02:31:39Z
updated_at: 2024-03-14T02:31:39Z
body:
  - To rename a table users must now have `drop-table` permission for the old name and `create-table` permission for the new name. [#60](https://github.com/simonw/datasette-edit-schema/issues/60)
  - Action menu items now have descriptions in addition to labels.


html_url: https://github.com/simonw/datasette-write/releases/tag/0.3.1
node_id: RE_kwDOEG8FFs4Iutuu
tag_name: 0.3.1
target_commitish: main
name: 0.3.1
created_at: 2024-03-14T02:34:32Z
published_at: 2024-03-14T02:35:52Z
updated_at: 2024-03-14T02:35:52Z
body:
  - Added a description to the database action menu item for [Datasette 1.0a13](https://docs.datasette.io/en/latest/changelog.html#a13-2024-03-12) and higher.


html_url: https://github.com/simonw/datasette-upload-csvs/releases/tag/0.9.1
node_id: RE_kwDODf8oPs4Iut3u
tag_name: 0.9.1
target_commitish: main
name: 0.9.1
created_at: 2024-03-14T02:43:26Z
published_at: 2024-03-14T02:44:37Z
updated_at: 2024-03-14T02:44:37Z
body:
  - Fixed incorrect page title on the upload page. [#40](https://github.com/simonw/datasette-upload-csvs/issues/40)
  - Added a description to the database action menu item for [Datasette 1.0a13](https://docs.datasette.io/en/latest/changelog.html#a13-2024-03-12) and higher.


html_url: https://github.com/simonw/datasette-configure-fts/releases/tag/1.1.3
node_id: RE_kwDODolrvM4IuuEo
tag_name: 1.1.3
target_commitish: main
name: 1.1.3
created_at: 2024-03-14T02:59:26Z
published_at: 2024-03-14T02:59:54Z
updated_at: 2024-03-14T02:59:54Z
body:
  - Added a description to the table action menu item for [Datasette 1.0a13](https://docs.datasette.io/en/latest/changelog.html#a13-2024-03-12) and higher.


html_url: https://github.com/datasette/datasette-export-database/releases/tag/0.1
node_id: RE_kwDOLd-Pcc4Ivq59
tag_name: 0.1
target_commitish: main
name: 0.1
created_at: 2024-03-15T05:01:37Z
published_at: 2024-03-15T05:03:43Z
updated_at: 2024-03-15T05:03:43Z
body:
  - Initial release. Users with the `export-database` permission gain the ability to export a snapshot of a database from an option in the database action menu. [#1](https://github.com/datasette/datasette-export-database/issues/1)


html_url: https://github.com/datasette/datasette-export-database/releases/tag/0.1.1
node_id: RE_kwDOLd-Pcc4IvrA5
tag_name: 0.1.1
target_commitish: main
name: 0.1.1
created_at: 2024-03-15T05:10:54Z
published_at: 2024-03-15T05:11:36Z
updated_at: 2024-03-15T05:11:36Z
body:
  - Fix for `NameError: name 'Permission' is not defined` error. [#2](https://github.com/datasette/datasette-export-database/issues/2)


html_url: https://github.com/datasette/datasette-export-database/releases/tag/0.2
node_id: RE_kwDOLd-Pcc4IvrSn
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2024-03-15T05:30:07Z
published_at: 2024-03-15T05:31:40Z
updated_at: 2024-03-15T05:31:40Z
body:
  - Database action menu now shows the size of the database in the menu item description. [#3](https://github.com/datasette/datasette-export-database/issues/3)
  - Confirm that signed URL token is from the same user based on their `csrftoken` cookie. [#4](https://github.com/datasette/datasette-export-database/issues/4)


html_url: https://github.com/datasette/datasette-export-database/releases/tag/0.2.1
node_id: RE_kwDOLd-Pcc4IwQbP
tag_name: 0.2.1
target_commitish: main
name: 0.2.1
created_at: 2024-03-16T00:47:58Z
published_at: 2024-03-16T00:49:48Z
updated_at: 2024-03-16T00:49:48Z
body:
  - Temporary files created for the user to download are now deleted after the download finishes, and any stale ones are cleared out when Datasette first starts running. [#5](https://github.com/datasette/datasette-export-database/issues/5)


html_url: https://github.com/simonw/datasette-packages/releases/tag/0.2.1
node_id: RE_kwDOHENadM4IwQr9
tag_name: 0.2.1
target_commitish: main
name: 0.2.1
created_at: 2024-03-16T01:17:45Z
published_at: 2024-03-16T01:18:41Z
updated_at: 2024-03-16T01:18:41Z
body:
  - Switch from `pkg_resources` to `importlib.metadata` to fix a deprecation warning. Dropped support for Python 3.7. [#6](https://github.com/simonw/datasette-packages/issues/6)


html_url: https://github.com/datasette/datasette-enrichments/releases/tag/0.3
node_id: RE_kwDOG0Ywas4IwjeP
tag_name: 0.3
target_commitish: main
name: 0.3
created_at: 2024-03-17T21:34:52Z
published_at: 2024-03-17T21:35:56Z
updated_at: 2024-03-17T21:35:56Z
body:
  - Now adds an "Enrich this row" row action menu item on [Datasette 1.0a13](https://docs.datasette.io/en/latest/changelog.html#a13-2024-03-12) and higher. [#41](https://github.com/datasette/datasette-enrichments/issues/41)


html_url: https://github.com/datasette/datasette-enrichments/releases/tag/0.3.1
node_id: RE_kwDOG0Ywas4IxXHE
tag_name: 0.3.1
target_commitish: main
name: 0.3.1
created_at: 2024-03-19T02:33:06Z
published_at: 2024-03-19T02:34:05Z
updated_at: 2024-03-19T02:34:05Z
body:
  - Fix for a bug where the row action menu did not work correctly for tables with primary keys starting with an underscore. [#42](https://github.com/datasette/datasette-enrichments/issues/42)


html_url: https://github.com/datasette/datasette-embeddings/releases/tag/0.1a0
node_id: RE_kwDOLk9FxM4I2IYC
tag_name: 0.1a0
target_commitish: main
name: 0.1a0
created_at: 2024-03-26T05:52:47Z
published_at: 2024-03-26T05:54:20Z
body:
  - Initial alpha release. Adds an enrichment for calculating and storing OpenAI embeddings for selected columns in a table. [#1](https://github.com/datasette/datasette-embeddings/issues/1)


html_url: https://github.com/datasette/datasette-embeddings/releases/tag/0.1a2
node_id: RE_kwDOLk9FxM4I4zE0
tag_name: 0.1a2
target_commitish: main
name: 0.1a2
created_at: 2024-03-30T18:40:13Z
published_at: 2024-03-30T18:40:36Z
body:
  - Fixed a packaging bug with the semantic search template. Refs [#2](https://github.com/datasette/datasette-embeddings/issues/2)


html_url: https://github.com/simonw/s3-credentials/releases/tag/0.16
node_id: RE_kwDOGUV9is4I7yLP
tag_name: 0.16
target_commitish: main
name: 0.16
created_at: 2024-04-05T05:37:34Z
published_at: 2024-04-05T05:38:06Z
updated_at: 2024-04-05T05:38:06Z
body:
  - New command: `s3-credentials debug-bucket bucket-name`. [#86](https://github.com/simonw/s3-credentials/issues/86)
  - Fixed bug where calling `s3-credentials create bucket-name --create-bucket --public` did not make the contents of the bucket available to the public. [#88](https://github.com/simonw/s3-credentials/issues/88)
  - `s3-credentials list-bucket bucket-name --urls` option. [#89](https://github.com/simonw/s3-credentials/issues/89)


html_url: https://github.com/simonw/s3-credentials/releases/tag/0.16.1
node_id: RE_kwDOGUV9is4I7ySu
tag_name: 0.16.1
target_commitish: main
name: 0.16.1
created_at: 2024-04-05T05:44:28Z
published_at: 2024-04-05T05:45:18Z
updated_at: 2024-04-05T05:45:18Z
body:
  - Fixed documentation bug. [s3-credentials.readthedocs.io](https://s3-credentials.readthedocs.io/) should now show the most recent stable release documentation.


html_url: https://github.com/datasette/datasette-enrichments-quickjs/releases/tag/0.1a2
node_id: RE_kwDOLQOkP84I8SKw
tag_name: 0.1a2
target_commitish: main
name: 0.1a2
created_at: 2024-04-05T22:06:34Z
published_at: 2024-04-05T22:07:16Z
body:
  - JavaScript functions can now return an object of key/value pairs, and columns will be created for each of those returned values. [#5](https://github.com/datasette/datasette-enrichments-quickjs/issues/5)


html_url: https://github.com/datasette/datasette-import/releases/tag/0.1a4
node_id: RE_kwDOLqtkrc4I8cAd
tag_name: 0.1a4
target_commitish: main
name: 0.1a4
created_at: 2024-04-06T16:20:55Z
published_at: 2024-04-06T16:22:27Z
updated_at: 2024-04-06T16:22:27Z
body:
  - Initial release. This is currently a renamed version of [datasette-paste](https://github.com/datasette/datasette-paste). [#1](https://github.com/datasette/datasette-import/issues/1)


html_url: https://github.com/datasette/datasette-embeddings/releases/tag/0.1a3
node_id: RE_kwDOLk9FxM4I8sdQ
tag_name: 0.1a3
target_commitish: main
name: 0.1a3
created_at: 2024-04-08T00:05:53Z
published_at: 2024-04-08T00:06:25Z
body:
  This alpha changes the way embedding vectors are stored. Previously they were stored on the table itself, as columns with names like `emb_text_embedding_3_large_256`. [#3](https://github.com/datasette/datasette-embeddings/issues/3)

  They are now instead stored in a separate table, with the name `_embeddings_TABLE` where `TABLE` is the name of the original table.

  If you have previously calculated embedding vectors stored in columns on an existing table, you can migrate them to the new table structure by following these steps: [#11](https://github.com/datasette/datasette-embeddings/issues/11)

  1. Create a new shadow table to store your embeddings. This table should have the name `_embeddings_TABLE` where `TABLE` is the name of your source table, and the same primary key (or compound primary keys). It should then have a `emb_xxx` column for each stored embedding vector.

      One way to create this table is to select a single row and embed just that - this will create the table for you while only costing you one embedding run.
  2. Run the following SQL query to copy across your vectors:

      ```sql
      insert or replace into _embeddings_TABLE (id, emb_xxx)
      select id, emb_xxx from TABLE where emb_xxx is not null
      ```
  3. Drop the old column: `alter table TABLE drop column emb_xxx`


html_url: https://github.com/simonw/datasette-cors/releases/tag/1.0
node_id: RE_kwDOC6oYpM4I9Mwk
tag_name: 1.0
target_commitish: main
name: 1.0
created_at: 2024-04-08T16:59:19Z
published_at: 2024-04-08T17:01:26Z
body:
  - `headers` option for setting `access-control-allow-headers`. [#5](https://github.com/simonw/datasette-cors/issues/5)
  - `methods` option for setting `access-control-allow-methods`.
  - `max_age` option for setting `access-control-max-age`.
  - Now tested against Datasette 1.0 as well as Datasette <1.0.


html_url: https://github.com/datasette/datasette-extract/releases/tag/0.1a4
node_id: RE_kwDOKHgxRM4I99T4
tag_name: 0.1a4
target_commitish: main
name: 0.1a4
created_at: 2024-04-09T19:22:49Z
published_at: 2024-04-09T19:24:48Z
updated_at: 2024-04-09T19:24:48Z
body:
  - This plugin now uses the general availability `gpt-4-turbo` model, which adds structured function support to GPT-4 Vision. [#19](https://github.com/datasette/datasette-extract/issues/19)
  - If an error occurs during an extraction operation it is now displayed on the progress page. [#10](https://github.com/datasette/datasette-extract/issues/10)
  - Table and database action menu items now have better copy. [#20](https://github.com/datasette/datasette-extract/issues/20)


html_url: https://github.com/datasette/datasette-enrichments/releases/tag/0.3.2
node_id: RE_kwDOG0Ywas4I9-pf
tag_name: 0.3.2
target_commitish: main
name: 0.3.2
created_at: 2024-04-09T20:06:13Z
published_at: 2024-04-09T20:06:23Z
updated_at: 2024-04-09T20:06:23Z
body:
  - Handle case where no enrichments plugins are installed. [#43](https://github.com/datasette/datasette-enrichments/issues/43)
  - Added description to the menu items.


html_url: https://github.com/datasette/datasette-public/releases/tag/0.2.3
node_id: RE_kwDOIIe2Hs4I9_Vu
tag_name: 0.2.3
target_commitish: main
name: 0.2.3
created_at: 2024-04-09T20:26:44Z
published_at: 2024-04-09T20:27:15Z
updated_at: 2024-04-09T20:27:15Z
body:
  - Added description to menu items for Datasette 1.0. [#7](https://github.com/simonw/datasette-public/issues/7)


html_url: https://github.com/datasette/datasette-enrichments-gpt/releases/tag/0.4
node_id: RE_kwDOKugxLc4I-HMm
tag_name: 0.4
target_commitish: main
name: 0.4
created_at: 2024-04-10T03:27:12Z
published_at: 2024-04-10T03:27:54Z
body:
  - Now uses the newly released `gpt-4-turbo` model, which also handles image inputs. [#8](https://github.com/datasette/datasette-enrichments-gpt/issues/8)


html_url: https://github.com/simonw/datasette-cors/releases/tag/1.0.1
node_id: RE_kwDOC6oYpM4I_gMw
tag_name: 1.0.1
target_commitish: main
name: 1.0.1
created_at: 2024-04-12T03:19:22Z
published_at: 2024-04-12T03:21:37Z
body:
  - Upgrade to `asgi_cors>=1.0.1` to address a bug that could cause duplicate CORS headers. [#13](https://github.com/simonw/asgi-cors/issues/13)


html_url: https://github.com/datasette/datasette-query-assistant/releases/tag/0.1a1
node_id: RE_kwDOLl8JfM4JBrwf
tag_name: 0.1a1
target_commitish: main
name: 0.1a1
created_at: 2024-04-16T19:41:42Z
published_at: 2024-04-16T19:42:16Z
updated_at: 2024-04-16T19:42:16Z
body:
  - Fix for a bug where tables with no related tables would throw an error. [#9](https://github.com/datasette/datasette-query-assistant/issues/9)


html_url: https://github.com/datasette/datasette-query-assistant/releases/tag/0.1a2
node_id: RE_kwDOLl8JfM4JBuKB
tag_name: 0.1a2
target_commitish: main
name: 0.1a2
created_at: 2024-04-16T20:52:05Z
published_at: 2024-04-16T20:53:20Z
updated_at: 2024-04-16T20:53:20Z
body:
  - Queries that produce invalid SQL should now correctly retry up to 3 times. [#10](https://github.com/datasette/datasette-query-assistant/issues/10)
  - Fix for bug with POST requests. [#9](https://github.com/datasette/datasette-query-assistant/issues/9)


html_url: https://github.com/simonw/openai-to-sqlite/releases/tag/0.4.2
node_id: RE_kwDOItf8Rs4JB1dn
tag_name: 0.4.2
target_commitish: main
name: 0.4.2
created_at: 2024-04-17T02:57:34Z
published_at: 2024-04-17T02:58:05Z
body:
  - Disable timeout on HTTPX requests to allow for slow responses. [#17](https://github.com/simonw/openai-to-sqlite/issues/17)


html_url: https://github.com/datasette/datasette-secrets/releases/tag/0.1a1
node_id: RE_kwDOLxu_vc4JFFtb
tag_name: 0.1a1
target_commitish: main
name: 0.1a1
created_at: 2024-04-23T05:32:49Z
published_at: 2024-04-23T05:34:09Z
updated_at: 2024-04-23T05:34:09Z
body:
  - The `last_used_at` and `last_used_by` columns are now updated every time the `get_secret()` function is called - it takes an optional third argument with the actor ID to record in `last_used_by`. [#4](https://github.com/datasette/datasette-secrets/issues/4)
  - Removed the `redacted` column from the table schema. [#6](https://github.com/datasette/datasette-secrets/issues/6)


html_url: https://github.com/simonw/datasette-edit-schema/releases/tag/0.8a2
node_id: RE_kwDODsD4Ds4JF1Ob
tag_name: 0.8a2
target_commitish: main
name: 0.8a2
created_at: 2024-04-24T04:06:06Z
published_at: 2024-04-24T04:07:32Z
updated_at: 2024-04-24T04:07:32Z
body:
  - Table names are now [tilde-encoded](https://docs.datasette.io/en/stable/internals.html#tilde-encoding), ensuring tables with unconventional characters like `/` and `.` in their names can still be linked to correctly. [#61](https://github.com/simonw/datasette-edit-schema/issues/61)
  - Fixed a bug where tables with unconventional names could not be configured as foreign keys. [#62](https://github.com/simonw/datasette-edit-schema/issues/62)


html_url: https://github.com/datasette/datasette-secrets/releases/tag/0.1a2
node_id: RE_kwDOLxu_vc4JGhu2
tag_name: 0.1a2
target_commitish: main
name: 0.1a2
created_at: 2024-04-24T22:05:39Z
published_at: 2024-04-24T22:07:45Z
updated_at: 2024-04-24T22:07:45Z
body:
  - If two secrets are registered with the same name, the first one wins (its description will be used instead of the later ones). [#10](https://github.com/datasette/datasette-secrets/issues/10)
  - The secrets display table now shows username or name if available for the "updated by" column. [#11](https://github.com/datasette/datasette-secrets/issues/11)
  - The `Secret()` class used to register secrets from other plugins now has properties `name`, `description`, `obtain_url` and `obtain_label` - the latter three replace the old `description_html` field. [#12](https://github.com/datasette/datasette-secrets/issues/12)


html_url: https://github.com/datasette/datasette-extract/releases/tag/0.1a5
node_id: RE_kwDOKHgxRM4JGiq4
tag_name: 0.1a5
target_commitish: main
name: 0.1a5
created_at: 2024-04-24T22:59:12Z
published_at: 2024-04-24T23:00:40Z
updated_at: 2024-04-24T23:00:40Z
body:
  - Switch to using [datasette-secrets](https://github.com/datasette/datasette-secrets) for configuration. If you were previously using the environment variable `OPENAI_API_KEY` you should change that to `DATASETTE_SECRETS_OPENAI_API_KEY`. [#24](https://github.com/datasette/datasette-extract/issues/24)


html_url: https://github.com/datasette/datasette-secrets/releases/tag/0.1a3
node_id: RE_kwDOLxu_vc4JGi_C
tag_name: 0.1a3
target_commitish: main
name: 0.1a3
created_at: 2024-04-24T23:21:17Z
published_at: 2024-04-24T23:22:05Z
updated_at: 2024-04-24T23:22:05Z
body:
  - Fixed bug where `get_secret()` would fail with an error if the `datasette_secrets` table was missing. [#13](https://github.com/datasette/datasette-secrets/issues/13)


html_url: https://github.com/datasette/datasette-secrets/releases/tag/0.1a4
node_id: RE_kwDOLxu_vc4JGlVH
tag_name: 0.1a4
target_commitish: main
name: 0.1a4
created_at: 2024-04-25T02:23:42Z
published_at: 2024-04-25T02:24:15Z
updated_at: 2024-04-25T02:24:15Z
body:
  - Fix 500 error on table page if plugin is not fully configured. [#14](https://github.com/datasette/datasette-secrets/issues/14)


html_url: https://github.com/simonw/datasette-leaflet-geojson/releases/tag/0.8.2
node_id: RE_kwDOCAwMN84JGn5d
tag_name: 0.8.2
target_commitish: main
name: 0.8.2
created_at: 2024-04-25T05:02:14Z
published_at: 2024-04-25T05:04:35Z
body:
  - Errors rendering one map no longer prevent others from rendering. Thanks, Moritz von Göwels. [#23](https://github.com/simonw/datasette-leaflet-geojson/pull/23)
  - Fixed a bug where tables with columns with JSON that contained `"type"` fields that were not strings could cause a 500 error. [#24](https://github.com/simonw/datasette-leaflet-geojson/issues/24)


html_url: https://github.com/datasette/datasette-extract/releases/tag/0.1a6
node_id: RE_kwDOKHgxRM4JHJm3
tag_name: 0.1a6
target_commitish: main
name: 0.1a6
created_at: 2024-04-25T19:04:14Z
published_at: 2024-04-25T19:05:21Z
updated_at: 2024-04-25T19:05:21Z
body:
  - Create table with AI extracted data page now has a "Add another column" button for if you need more than ten columns. [#25](https://github.com/datasette/datasette-extract/issues/25)


html_url: https://github.com/datasette/datasette-secrets/releases/tag/0.2
node_id: RE_kwDOLxu_vc4JH5le
tag_name: 0.2
target_commitish: main
name: 0.2
created_at: 2024-04-26T23:19:31Z
published_at: 2024-04-26T23:20:48Z
updated_at: 2024-04-26T23:20:48Z
body:
  - First non-alpha release.
  - Now compatible with both Datasette < 1.0 and Datasette >= 1.0a. [#15](https://github.com/datasette/datasette-secrets/issues/15)


html_url: https://github.com/datasette/datasette-enrichments/releases/tag/0.4
node_id: RE_kwDOG0Ywas4JH8yw
tag_name: 0.4
target_commitish: main
name: 0.4
created_at: 2024-04-27T06:00:26Z
published_at: 2024-04-27T06:03:23Z
updated_at: 2024-04-27T06:03:46Z
body:
  - New utilities for developing enrichments that need to be [configured with secrets](https://enrichments.datasette.io/en/stable/developing.html#enrichments-that-use-secrets-such-as-api-keys) such as API keys, taking advantage of the [datasette-secrets](https://datasette.io/plugins/datasette-secrets) plugin. [#46](https://github.com/datasette/datasette-enrichments/issues/46)


html_url: https://github.com/datasette/datasette-enrichments/releases/tag/0.4.1
node_id: RE_kwDOG0Ywas4JIDd9
tag_name: 0.4.1
target_commitish: main
name: 0.4.1
created_at: 2024-04-27T22:03:42Z
published_at: 2024-04-27T22:04:30Z
updated_at: 2024-04-27T22:04:30Z
body:
  - Removed `breakpoint()` calls in an error path that should not have been released. [#49](https://github.com/datasette/datasette-enrichments/issues/49)


html_url: https://github.com/datasette/datasette-enrichments/releases/tag/0.4.2
node_id: RE_kwDOG0Ywas4JIDwu
tag_name: 0.4.2
target_commitish: main
name: 0.4.2
created_at: 2024-04-27T22:43:19Z
published_at: 2024-04-27T22:44:08Z
updated_at: 2024-04-27T22:44:16Z
body:
  - The `get_config_form()` method is now optional when implementing an enrichment, as previously incorrectly described in the documentation. [#44](https://github.com/datasette/datasette-enrichments/issues/44)


html_url: https://github.com/simonw/ttok/releases/tag/0.3
node_id: RE_kwDOJkvrZc4JLIwS
tag_name: 0.3
target_commitish: main
name: 0.3
created_at: 2024-05-02T23:34:37Z
published_at: 2024-05-02T23:37:54Z
body:
  - New `--allow-special` option for allowing special tokens: `ttok '<|endoftext|>' --encode --allow-special` [#13](https://github.com/simonw/ttok/issues/13)


html_url: https://github.com/simonw/llm/releases/tag/0.14
node_id: RE_kwDOJRhX7M4JReoj
tag_name: 0.14
target_commitish: main
name: 0.14
created_at: 2024-05-13T20:37:23Z
published_at: 2024-05-13T20:40:08Z
updated_at: 2024-05-13T20:40:08Z
body:
  - Support for OpenAI's [new GPT-4o](https://openai.com/index/hello-gpt-4o/) model: `llm -m gpt-4o 'say hi in Spanish'` [#490](https://github.com/simonw/llm/issues/490)
  - The `gpt-4-turbo` alias is now a model ID, which indicates the latest version of OpenAI's GPT-4 Turbo text and image model. Your existing `logs.db` database may contain records under the previous model ID of `gpt-4-turbo-preview`. [#493](https://github.com/simonw/llm/issues/493)
  - New `llm logs -r/--response` option for outputting just the last captured response, without wrapping it in Markdown and accompanying it with the prompt. [#431](https://github.com/simonw/llm/issues/431)
  - Nine new {ref}`plugins <plugin-directory>` since version 0.13:
    - **[llm-claude-3](https://github.com/simonw/llm-claude-3)** supporting Anthropic's [Claude 3 family](https://www.anthropic.com/news/claude-3-family) of models.
    - **[llm-command-r](https://github.com/simonw/llm-command-r)** supporting Cohere's Command R and [Command R Plus](https://txt.cohere.com/command-r-plus-microsoft-azure/) API models.
    - **[llm-reka](https://github.com/simonw/llm-reka)** supports the [Reka](https://www.reka.ai/) family of models via their API.
    - **[llm-perplexity](https://github.com/hex/llm-perplexity)** by Alexandru Geana supporting the [Perplexity Labs](https://docs.perplexity.ai/) API models, including `llama-3-sonar-large-32k-online` which can search for things online and `llama-3-70b-instruct`.
    - **[llm-groq](https://github.com/angerman/llm-groq)** by Moritz Angermann providing access to fast models hosted by [Groq](https://console.groq.com/docs/models).
    - **[llm-fireworks](https://github.com/simonw/llm-fireworks)** supporting models hosted by [Fireworks AI](https://fireworks.ai/).
    - **[llm-together](https://github.com/wearedevx/llm-together)** adds support for the [Together AI](https://www.together.ai/) extensive family of hosted openly licensed models.
    - **[llm-embed-onnx](https://github.com/simonw/llm-embed-onnx)** provides seven embedding models that can be executed using the ONNX model framework.
    - **[llm-cmd](https://github.com/simonw/llm-cmd)** accepts a prompt for a shell command, runs that prompt and populates the result in your shell so you can review it, edit it and then hit `<enter>` to execute or `ctrl+c` to cancel, see [this post for details](https://simonwillison.net/2024/Mar/26/llm-cmd/).

reactions:
  {"url": "https://api.github.com/repos/simonw/llm/releases/155576867/reactions", "total_count": 5, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 5, "eyes": 0}


html_url: https://github.com/datasette/datasette-extract/releases/tag/0.1a7
node_id: RE_kwDOKHgxRM4JSWFX
tag_name: 0.1a7
target_commitish: main
name: 0.1a7
created_at: 2024-05-15T04:29:49Z
published_at: 2024-05-15T04:30:57Z
updated_at: 2024-05-15T04:30:57Z
body:
  - Now uses GPT-4o instead of GPT-4 Turbo - the new model is cheaper, faster and likely a little bit better too. [#28](https://github.com/datasette/datasette-extract/issues/28)


html_url: https://github.com/datasette/datasette-enrichments-gpt/releases/tag/0.5
node_id: RE_kwDOKugxLc4JS-df
tag_name: 0.5
target_commitish: main
name: 0.5
created_at: 2024-05-15T21:45:20Z
published_at: 2024-05-15T21:48:50Z
body:
  - Now uses [datasette-secrets](https://github.com/datasette/datasette-secrets) for configuration. If you were previously using the environment variable `OPENAI_API_KEY` you should change that to `DATASETTE_SECRETS_OPENAI_API_KEY`. [#9](https://github.com/datasette/datasette-extract/issues/9)
  - Switched from using GPT-4 Turbo to the new [GPT-4o](https://openai.com/index/hello-gpt-4o/), which is half the price and should provide better results. [#14](https://github.com/datasette/datasette-enrichments-gpt/issues/14)


html_url: https://github.com/simonw/datasette/releases/tag/0.64.7
node_id: RE_kwDOBm6k_c4JjDbN
tag_name: 0.64.7
target_commitish: 0.64.x
name: 0.64.7
created_at: 2024-06-12T23:04:17Z
published_at: 2024-06-12T23:09:31Z
updated_at: 2024-06-12T23:09:31Z
body:
  - Fixed a bug where canned queries with named parameters threw an error when run against SQLite 3.46.0. ([#2353](https://github.com/simonw/datasette/issues/2353))


html_url: https://github.com/simonw/datasette-cluster-map/releases/tag/0.18.2
node_id: RE_kwDOB8NBWs4Jj2Nk
tag_name: 0.18.2
target_commitish: main
name: 0.18.2
created_at: 2024-06-13T23:04:49Z
published_at: 2024-06-13T23:06:02Z
body:
  - Fixed bug where default tiles were displayed at retina resolution in a way that caused the map labels to be illegibly small. [#48](https://github.com/simonw/datasette-cluster-map/issues/48)


html_url: https://github.com/simonw/datasette-faiss/releases/tag/0.2.1
node_id: RE_kwDOIwW61s4Jl2dq
tag_name: 0.2.1
target_commitish: main
name: 0.2.1
created_at: 2024-06-17T18:11:35Z
published_at: 2024-06-17T18:12:08Z
body:
  - Pin to NumPy 1.x - the `faiss-cpu` library this depends on is not yet compatible with NumPy 2. [#4](https://github.com/simonw/datasette-faiss/issues/4)


html_url: https://github.com/simonw/datasette/releases/tag/0.64.8
node_id: RE_kwDOBm6k_c4JpCVi
tag_name: 0.64.8
target_commitish: 0.64.x
name: 0.64.8
created_at: 2024-06-21T23:39:42Z
published_at: 2024-06-21T23:42:18Z
updated_at: 2024-06-21T23:42:18Z
body:
  - Security improvement: 404 pages used to reflect content from the URL path, which could be used to display misleading information to Datasette users. 404 errors no longer display additional information from the URL. ([#2359](https://github.com/simonw/datasette/issues/2359))
  - Backported a better fix for correctly extracting named parameters from canned query SQL against SQLite 3.46.0. ([#2353](https://github.com/simonw/datasette/issues/2353))

reactions:
  {"url": "https://api.github.com/repos/simonw/datasette/releases/161752418/reactions", "total_count": 2, "+1": 1, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 1, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/sqlite-utils/releases/tag/3.37
node_id: RE_kwDOCGYnMM4J5q7l
tag_name: 3.37
target_commitish: main
name: 3.37
created_at: 2024-07-18T18:43:07Z
published_at: 2024-07-18T18:44:02Z
updated_at: 2024-07-18T18:44:02Z
body:
  -   The `create-table` and `insert-files` commands all now accept multiple `--pk` options for compound primary keys. ([#620](https://github.com/simonw/sqlite-utils/issues/620))
  -   Now tested against Python 3.13 pre-release. ([#619](https://github.com/simonw/sqlite-utils/pull/619))
  -   Fixed a crash that can occur in environments with a broken `numpy` installation, producing a `module 'numpy' has no attribute 'int8'`. ([#632](https://github.com/simonw/sqlite-utils/issues/632))

reactions:
  {"url": "https://api.github.com/repos/simonw/sqlite-utils/releases/166112997/reactions", "total_count": 1, "+1": 1, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/llm/releases/tag/0.15
node_id: RE_kwDOJRhX7M4J5str
tag_name: 0.15
target_commitish: main
name: 0.15
created_at: 2024-07-18T19:31:14Z
published_at: 2024-07-18T19:33:03Z
updated_at: 2024-07-18T19:33:03Z
body:
  - Support for OpenAI's [new GPT-4o mini](https://openai.com/index/gpt-4o-mini-advancing-cost-efficient-intelligence/) model: `llm -m gpt-4o-mini 'rave about pelicans in French'` [#536](https://github.com/simonw/llm/issues/536)
  - `gpt-4o-mini` is now the default model if you do not [specify your own default](https://llm.datasette.io/en/stable/setup.html#setting-a-custom-default-model), replacing GPT-3.5 Turbo. GPT-4o mini is both cheaper and better than GPT-3.5 Turbo.
  - Fixed a bug where `llm logs -q 'flourish' -m haiku` could not combine both the `-q` search query and the `-m` model specifier. [#515](https://github.com/simonw/llm/issues/515)

reactions:
  {"url": "https://api.github.com/repos/simonw/llm/releases/166120299/reactions", "total_count": 3, "+1": 0, "-1": 0, "laugh": 0, "hooray": 3, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/datasette/datasette-extract/releases/tag/0.1a8
node_id: RE_kwDOKHgxRM4J-LvD
tag_name: 0.1a8
target_commitish: main
name: 0.1a8
created_at: 2024-07-26T04:59:25Z
published_at: 2024-07-26T05:01:47Z
updated_at: 2024-07-26T05:01:47Z
body:
  - Now uses GPT-4o mini, which is around 30 times cheaper than GPT-4o for text tasks, though the same price for image tasks. [#30](https://github.com/datasette/datasette-extract/issues/30)
  - New feature: on the "Extract data into this table" page there is now a link to "Duplicate these columns to a new table" which pre-fills the create table form with the same columns and hints. [#29](https://github.com/datasette/datasette-extract/issues/29)


html_url: https://github.com/simonw/datasette/releases/tag/1.0a14
node_id: RE_kwDOBm6k_c4KD5Ay
tag_name: 1.0a14
target_commitish: main
name: 1.0a14
created_at: 2024-08-05T21:30:02Z
published_at: 2024-08-05T21:31:43Z
updated_at: 2024-08-05T21:31:43Z
body:
  This alpha introduces significant changes to Datasette's [Metadata](https://docs.datasette.io/en/latest/metadata.html#metadata) system, some of which represent breaking changes in advance of the full 1.0 release. The new [Upgrade guide](https://docs.datasette.io/en/latest/upgrade_guide.html#upgrade-guide) document provides detailed coverage of those breaking changes and how they affect plugin authors and Datasette API consumers.

  - The `/databasename?sql=` interface and JSON API for executing arbitrary SQL queries can now be found at `/databasename/-/query?sql=`. Requests with a `?sql=` parameter to the old endpoints will be redirected. Thanks, [Alex Garcia](https://github.com/asg017). ([#2360](https://github.com/simonw/datasette/issues/2360))
  - Metadata about tables, databases, instances and columns is now stored in [Datasette's internal database](https://docs.datasette.io/en/latest/internals.html#internals-internal). Thanks, Alex Garcia. ([#2341](https://github.com/simonw/datasette/issues/2341))
  - Database write connections now execute using the `IMMEDIATE` isolation level for SQLite. This should help avoid a rare `SQLITE_BUSY` error that could occur when a transaction upgraded to a write mid-flight. ([#2358](https://github.com/simonw/datasette/issues/2358))
  - Fix for a bug where canned queries with named parameters could fail against SQLite 3.46. ([#2353](https://github.com/simonw/datasette/issues/2353))
  - Datasette now serves `E-Tag` headers for static files. Thanks, [Agustin Bacigalup](https://github.com/redraw). ([#2306](https://github.com/simonw/datasette/pull/2306))
  - Dropdown menus now use a `z-index` that should avoid them being hidden by plugins. ([#2311](https://github.com/simonw/datasette/issues/2311))
  - Incorrect table and row names are no longer reflected back on the resulting 404 page. ([#2359](https://github.com/simonw/datasette/issues/2359))
  - Improved documentation for async usage of the [track_event(datasette, event)](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-track-event) hook. ([#2319](https://github.com/simonw/datasette/issues/2319))
  - Fixed some HTTPX deprecation warnings. ([#2307](https://github.com/simonw/datasette/issues/2307))
  - Datasette now serves a `<html lange="en">` attribute. Thanks, [Charles Nepote](https://github.com/CharlesNepote). ([#2348](https://github.com/simonw/datasette/issues/2348))
  - Datasette's automated tests now run against the maximum and minimum supported versions of SQLite: 3.25 (from September 2018) and 3.46 (from May 2024). Thanks, Alex Garcia. ([#2352](https://github.com/simonw/datasette/pull/2352))
  - Fixed an issue where clicking twice on the URL output by `datasette --root` produced a confusing error. ([#2375](https://github.com/simonw/datasette/issues/2375))


html_url: https://github.com/simonw/datasette-remote-metadata/releases/tag/0.2a0
node_id: RE_kwDOF0cZTM4KD6rU
tag_name: 0.2a0
target_commitish: datasette-alpha
name: 0.2a0
created_at: 2024-08-05T22:43:54Z
published_at: 2024-08-05T22:45:57Z
body:
  - Updated for compatibility with [Datasette 1.0a14](https://docs.datasette.io/en/1.0a14/changelog.html#a14-2024-08-05). [#4](https://github.com/simonw/datasette-remote-metadata/issues/4)


html_url: https://github.com/eyeseast/datasette-geojson-map/releases/tag/v0.5.0
node_id: RE_kwDOFtPpRM4KHI9R
tag_name: v0.5.0
target_commitish: main
name: v0.5.0
created_at: 2024-08-10T21:46:14Z
published_at: 2024-08-10T21:47:47Z
body:
  ## What's Changed
  * Use a full URL to reference the image by @simonw in https://github.com/eyeseast/datasette-geojson-map/pull/20
  * Fix marker images and demo by @eyeseast in https://github.com/eyeseast/datasette-geojson-map/pull/29

  ## New Contributors
  * @simonw made their first contribution in https://github.com/eyeseast/datasette-geojson-map/pull/20

  **Full Changelog**: https://github.com/eyeseast/datasette-geojson-map/compare/v0.4.0...v0.5.0


html_url: https://github.com/simonw/datasette/releases/tag/1.0a15
node_id: RE_kwDOBm6k_c4KKUOW
tag_name: 1.0a15
target_commitish: main
name: 1.0a15
created_at: 2024-08-16T05:04:04Z
published_at: 2024-08-16T05:05:47Z
updated_at: 2024-08-16T05:05:47Z
body:
  - Datasette now defaults to hiding SQLite "shadow" tables, as seen in extensions such as SQLite FTS and [sqlite-vec](https://github.com/asg017/sqlite-vec). Virtual tables that it makes sense to display, such as FTS core tables, are no longer hidden. Thanks, [Alex Garcia](https://github.com/asg017). ([#2296](https://github.com/simonw/datasette/issues/2296))
  - Fixed bug where running Datasette with one or more `-s/--setting` options could over-ride settings that were present in `datasette.yml`. ([#2389](https://github.com/simonw/datasette/issues/2389))
  - The Datasette homepage is now duplicated at `/-/`, using the default `index.html` template. This ensures that the information on that page is still accessible even if the Datasette homepage has been customized using a custom `index.html` template, for example on sites like [datasette.io](https://datasette.io/). ([#2393](https://github.com/simonw/datasette/issues/2393))
  - Failed CSRF checks now display a more user-friendly error page. ([#2390](https://github.com/simonw/datasette/issues/2390))
  - Fixed a bug where the `json1` extension was not correctly detected on the `/-/versions` page. Thanks, [Seb Bacon](https://github.com/sebbacon). ([#2326](https://github.com/simonw/datasette/issues/2326))
  - Fixed a bug where the Datasette write API did not correctly accept `Content-Type: application/json; charset=utf-8`. ([#2384](https://github.com/simonw/datasette/issues/2384))
  - Fixed a bug where Datasette would fail to start if `metadata.yml` contained a `queries` block. ([#2386](https://github.com/simonw/datasette/pull/2386))


html_url: https://github.com/datasette/datasette-checkbox/releases/tag/0.1a0
node_id: RE_kwDOMkfZPs4KLBiL
tag_name: 0.1a0
target_commitish: main
name: 0.1a0
created_at: 2024-08-16T20:40:07Z
published_at: 2024-08-16T20:41:52Z
updated_at: 2024-08-16T20:41:52Z
body:
  - Initial release. Adds interactive checkbox widgets to any integer column with a `is_*` or `should_*` name, provided the current user has `update-row` permissions. [#1](https://github.com/datasette/datasette-checkbox/issues/1)


html_url: https://github.com/datasette/datasette-checkbox/releases/tag/0.1a1
node_id: RE_kwDOMkfZPs4KLCb9
tag_name: 0.1a1
target_commitish: main
name: 0.1a1
created_at: 2024-08-16T20:54:25Z
published_at: 2024-08-16T20:55:11Z
updated_at: 2024-08-16T20:55:11Z
body:
  - Fixed compatibility issue with `datasette-write-ui` and `datasette-comments`. [#2](https://github.com/datasette/datasette-checkbox/issues/2)


html_url: https://github.com/datasette/datasette-checkbox/releases/tag/0.1a2
node_id: RE_kwDOMkfZPs4KLENO
tag_name: 0.1a2
target_commitish: main
name: 0.1a2
created_at: 2024-08-16T21:22:18Z
published_at: 2024-08-16T21:22:45Z
updated_at: 2024-08-16T21:22:45Z
body:
  - Now supports `has_*` columns in addition to `is_*` and `should_*`. [#3](https://github.com/datasette/datasette-checkbox/issues/3)


html_url: https://github.com/simonw/datasette-pretty-traces/releases/tag/0.5
node_id: RE_kwDOGhtmrs4KNnyA
tag_name: 0.5
target_commitish: main
name: 0.5
created_at: 2024-08-21T19:28:52Z
published_at: 2024-08-21T19:31:00Z
updated_at: 2024-08-21T19:31:00Z
body:
  - Display errors differently, depending on [this new Datasette feature](https://github.com/simonw/datasette/issues/2405). [#8](https://github.com/simonw/datasette-pretty-traces/issues/8)


html_url: https://github.com/simonw/datasette-edit-schema/releases/tag/0.8a3
node_id: RE_kwDODsD4Ds4KU8EY
tag_name: 0.8a3
target_commitish: main
name: 0.8a3
created_at: 2024-09-03T16:33:59Z
published_at: 2024-09-03T16:35:13Z
updated_at: 2024-09-03T16:35:13Z
body:
  - Fixed CSS for compatibility with upcoming Datasette 1.0 alpha. [datasette#2417](https://github.com/simonw/datasette/issues/2417)


html_url: https://github.com/simonw/datasette-configure-fts/releases/tag/1.1.4
node_id: RE_kwDODolrvM4KU-VF
tag_name: 1.1.4
target_commitish: main
name: 1.1.4
created_at: 2024-09-03T17:26:48Z
published_at: 2024-09-03T17:27:22Z
updated_at: 2024-09-03T17:27:22Z
body:
  - Fixed CSS for compatibility with upcoming Datasette 1.0 alpha. [datasette#2417](https://github.com/simonw/datasette/issues/2417)


html_url: https://github.com/simonw/datasette-auth-passwords/releases/tag/1.1.1
node_id: RE_kwDOEKamw84KU_e8
tag_name: 1.1.1
target_commitish: main
name: 1.1.1
created_at: 2024-09-03T17:49:00Z
published_at: 2024-09-03T17:53:00Z
body:
  - Fix for compatibility with the `base_url` setting. Thanks, [@meowcat](https://github.com/meowcat) [#25](https://github.com/simonw/datasette-auth-passwords/issues/25)
  - `autocomplete="off"` on password field. Thanks, [@brandonrobertz](https://github.com/brandonrobertz) [#24](https://github.com/simonw/datasette-auth-passwords/pull/24)
  - Fixed CSS for compatibility with upcoming Datasette 1.0 alpha. [datasette#2417](https://github.com/simonw/datasette/issues/2417)


html_url: https://github.com/simonw/datasette-write/releases/tag/0.4
node_id: RE_kwDOEG8FFs4KVP5C
tag_name: 0.4
target_commitish: main
name: 0.4
created_at: 2024-09-04T04:46:45Z
published_at: 2024-09-04T04:49:02Z
updated_at: 2024-09-04T04:49:02Z
body:
  - Database write page URLs are now `/db/-/write`, the old `/-/write?database=db` page redirects to the new location. [#12](https://github.com/simonw/datasette-write/issues/12)
  - Removed the application menu item so as not to duplicate the database action item.
  - New row action menu item (on Datasette 1.0a13 and higher) linking to a SQL query to edit the current values of that row. [#10](https://github.com/simonw/datasette-write/issues/10)
  - Fixed CSS for compatibility with upcoming Datasette 1.0 alpha. [datasette#2417](https://github.com/simonw/datasette/issues/2417)


html_url: https://github.com/simonw/datasette-search-all/releases/tag/1.1.3
node_id: RE_kwDODqd5284KVQri
tag_name: 1.1.3
target_commitish: main
name: 1.1.3
created_at: 2024-09-04T05:23:05Z
published_at: 2024-09-04T05:23:35Z
updated_at: 2024-09-04T05:23:35Z
body:
  - Now skips tables ending in `_fts` to avoid duplicate search results in most recent Datasette alphas.
  - Fixed CSS for compatibility with upcoming Datasette 1.0 alpha. [#20](https://github.com/simonw/datasette-search-all/issues/20), [datasette#2417](https://github.com/simonw/datasette/issues/2417)


html_url: https://github.com/simonw/datasette-search-all/releases/tag/1.1.4
node_id: RE_kwDODqd5284KW2BV
tag_name: 1.1.4
target_commitish: main
name: 1.1.4
created_at: 2024-09-06T03:09:45Z
published_at: 2024-09-06T03:10:30Z
updated_at: 2024-09-06T03:10:30Z
body:
  - More CSS compatibility with future Datasette alpha releases. [#21](https://github.com/simonw/datasette-search-all/issues/21)


html_url: https://github.com/simonw/datasette/releases/tag/1.0a16
node_id: RE_kwDOBm6k_c4KW3dh
tag_name: 1.0a16
target_commitish: main
name: 1.0a16
created_at: 2024-09-06T03:56:46Z
published_at: 2024-09-06T03:58:44Z
updated_at: 2024-09-06T03:58:44Z
body:
  This release focuses on performance, in particular against large tables, and introduces some minor breaking changes for CSS styling in Datasette plugins.
  - Removed the unit conversions feature and its dependency, Pint. This means Datasette is now compatible with the upcoming Python 3.13. ([#2400](https://github.com/simonw/datasette/issues/2400), [#2320](https://github.com/simonw/datasette/issues/2320))
  - The `datasette --pdb` option now uses the [ipdb](https://github.com/gotcha/ipdb) debugger if it is installed. You can install it using `datasette install ipdb`. Thanks, [Tiago Ilieve](https://github.com/myhro). ([#2342](https://github.com/simonw/datasette/pull/2342))
  - Fixed a confusing error that occurred if `metadata.json` contained nested objects. ([#2403](https://github.com/simonw/datasette/issues/2403))
  - Fixed a bug with `?_trace=1` where it returned a blank page if the response was larger than 256KB. ([#2404](https://github.com/simonw/datasette/issues/2404))
  - Tracing mechanism now also displays SQL queries that returned errors or ran out of time. [datasette-pretty-traces 0.5](https://github.com/simonw/datasette-pretty-traces/releases/tag/0.5) includes support for displaying this new type of trace. ([#2405](https://github.com/simonw/datasette/issues/2405))
  - Fixed a text spacing with table descriptions on the homepage. ([#2399](https://github.com/simonw/datasette/issues/2399))
  - Performance improvements for large tables:
      - Suggested facets now only consider the first 1000 rows. ([#2406](https://github.com/simonw/datasette/issues/2406))
      - Improved performance of date facet suggestion against large tables. ([#2407](https://github.com/simonw/datasette/issues/2407))
      - Row counts stop at 10,000 rows when listing tables. ([#2398](https://github.com/simonw/datasette/issues/2398))
      - On table page the count stops at 10,000 rows too, with a "count all" button to execute the full count. ([#2408](https://github.com/simonw/datasette/issues/2408))
  - New `.dicts()` internal method on [Results](https://docs.datasette.io/en/latest/internals.html#database-results) that returns a list of dictionaries representing the results from a SQL query: ([#2414](https://github.com/simonw/datasette/issues/2414))
      ```python
      rows  =  (await  db.execute("select * from t")).dicts()
      ```
  - Default Datasette core CSS that styles inputs and buttons now requires a class of `"core"` on the element or a containing element, for example `<form class="core">`. ([#2415](https://github.com/simonw/datasette/issues/2415))
  - Similarly, default table styles now only apply to `<table class="rows-and-columns">`. ([#2420](https://github.com/simonw/datasette/issues/2420))

reactions:
  {"url": "https://api.github.com/repos/simonw/datasette/releases/173766497/reactions", "total_count": 1, "+1": 1, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/csv-diff/releases/tag/1.2
node_id: RE_kwDOCnMxmc4KW4oD
tag_name: 1.2
target_commitish: main
name: 1.2
created_at: 2024-09-06T05:18:11Z
published_at: 2024-09-06T05:20:04Z
body:
  - New feature: `--extra key "python format string"`, for adding additional output keys to the human-readable version of the diff. [#38](https://github.com/simonw/csv-diff/issues/38)
  - Don't crash in JSON format mode if some JSON keys are missing. [#13](https://github.com/simonw/csv-diff/issues/13)
  - Now includes a `Dockerfile` and instructions for building and running it that way. Thanks, [@gourk](https://github.com/gourk). [#11](https://github.com/simonw/csv-diff/issues/11)


html_url: https://github.com/simonw/llm/releases/tag/0.16
node_id: RE_kwDOJRhX7M4KbCpR
tag_name: 0.16
target_commitish: main
name: 0.16
created_at: 2024-09-12T23:20:12Z
published_at: 2024-09-12T23:20:48Z
updated_at: 2024-09-12T23:20:48Z
body:
  - OpenAI models now use the internal `self.get_key()` mechanism, which means they can be used from Python code in a way that will pick up keys that have been configured using `llm keys set` or the `OPENAI_API_KEY` environment variable. [#552](https://github.com/simonw/llm/issues/552). This code now works correctly:
      ```python
      import llm
      print(llm.get_model("gpt-4o-mini").prompt("hi"))
      ```
  - New documented API methods: `llm.get_default_model()`, `llm.set_default_model(alias)`, `llm.get_default_embedding_model(alias)`, `llm.set_default_embedding_model()`. [#553](https://github.com/simonw/llm/issues/553)
  - Support for OpenAI's new [o1 family](https://openai.com/o1/) of preview models, `llm -m o1-preview "prompt"` and `llm -m o1-mini "prompt"`. These models are currently only available to [tier 5](https://platform.openai.com/docs/guides/rate-limits/usage-tiers?context=tier-five) OpenAI API users, though this may change in the future. [#570](https://github.com/simonw/llm/issues/570)

reactions:
  {"url": "https://api.github.com/repos/simonw/llm/releases/174860881/reactions", "total_count": 1, "+1": 1, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/shot-scraper/releases/tag/1.5
node_id: RE_kwDOG-A5W84Kj851
tag_name: 1.5
target_commitish: main
name: 1.5
created_at: 2024-09-27T02:46:07Z
published_at: 2024-09-27T02:46:52Z
updated_at: 2024-09-27T02:46:52Z
body:
  - Several new features for the YAML configuration used by [shot-scraper multi](https://shot-scraper.datasette.io/en/stable/multi.html):
    - You can now add a `- server: python -m http.server 8003` block to [start a server running](https://shot-scraper.datasette.io/en/stable/multi.html#running-a-server-for-the-duration-of-the-session) before screenshots are taken. The PID for this server will be recorded and the server automatically terminated when the command completes, unless you specify the `--leave-server` option in which case it will be left running, useful for debugging. #156
    - The `sh: shell command` or `python: python code` blocks can [specify Python or shell commands](https://shot-scraper.datasette.io/en/stable/multi.html#running-custom-code-between-steps) to run before a screenshot is taken. This means a YAML script can make modifications to the environment in between screenshots, useful for things like progressive tutorials. #155
  - Fixed a bug that occurred if a `max-width` was accidentally applied to the `<div>` used for region screenshots. Thanks, [Johann Klähn](https://github.com/kljohann). #143
  - Documented that `shot-scraper` will quit with an error if a `--wait-for` expression has not resolved in 30s.


html_url: https://github.com/simonw/datasette/releases/tag/0.65
node_id: RE_kwDOBm6k_c4Kp2Lr
tag_name: 0.65
target_commitish: 0.64.x
name: 0.65
created_at: 2024-10-07T17:33:20Z
published_at: 2024-10-07T17:38:03Z
updated_at: 2024-10-07T17:38:03Z
body:
  - Upgrade for compatibility with Python 3.13 (by vendoring Pint dependency). ([#2434](https://github.com/simonw/datasette/issues/2434))
  - Dropped support for Python 3.8.

reactions:
  {"url": "https://api.github.com/repos/simonw/datasette/releases/178741995/reactions", "total_count": 2, "+1": 2, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/llm/releases/tag/0.17a0
node_id: RE_kwDOJRhX7M4K3pyA
tag_name: 0.17a0
target_commitish: main
name: 0.17a0
created_at: 2024-10-28T22:46:52Z
published_at: 2024-10-28T22:49:30Z
updated_at: 2024-10-28T22:49:45Z
body:
  Alpha support for **attachments**, allowing multi-modal models to accept images, audio, video and other formats. [#578](https://github.com/simonw/llm/issues/578)

  Attachments [in the CLI](https://llm.datasette.io/en/latest/usage.html#usage-attachments) can be URLs:
  ```bash
  llm "describe this image" \
    -a https://static.simonwillison.net/static/2024/pelicans.jpg
  ```
  Or file paths:
  ```bash
  llm "extract text" -a image1.jpg -a image2.jpg
  ```
  Or binary data, which may need to use `--attachment-type` to specify the MIME type:
  ```bash
  cat image | llm "extract text" --attachment-type - image/jpeg
  ```
  Attachments are also available [in the Python API](https://llm.datasette.io/en/latest/python-api.html#python-api-attachments):
  ```python
  model = llm.get_model("gpt-4o-mini")
  response = model.prompt(
      "Describe these images",
      attachments=[
          llm.Attachment(path="pelican.jpg"),
          llm.Attachment(url="https://static.simonwillison.net/static/2024/pelicans.jpg"),
      ]
  )
  ```
  Plugins that provide alternative models can support attachments, see [Attachments for multi-modal models](https://llm.datasette.io/en/latest/plugins/advanced-model-plugins.html#advanced-model-plugins-attachments) for details.

reactions:
  {"url": "https://api.github.com/repos/simonw/llm/releases/182361216/reactions", "total_count": 2, "+1": 0, "-1": 0, "laugh": 0, "hooray": 2, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/llm/releases/tag/0.17
node_id: RE_kwDOJRhX7M4K3ty7
tag_name: 0.17
target_commitish: main
name: 0.17
created_at: 2024-10-29T02:36:12Z
published_at: 2024-10-29T02:39:10Z
updated_at: 2024-11-06T06:27:28Z
body:
  Support for **attachments**, allowing multi-modal models to accept images, audio, video and other formats. [#587](https://github.com/simonw/llm/issues/587)

  The default OpenAI `gpt-4o` and `gpt-4o-mini` models can both now be prompted with JPEG, GIF, PNG and WEBP images.

  Attachments [in the CLI](https://llm.datasette.io/en/stable/usage.html#attachments) can be URLs:

  ```bash
  llm -m gpt-4o "describe this image" \
    -a https://static.simonwillison.net/static/2024/pelicans.jpg
  ```
  Or file paths:
  ```bash
  llm -m gpt-4o-mini "extract text" -a image1.jpg -a image2.jpg
  ```
  Or binary data, which may need to use `--attachment-type` to specify the MIME type:
  ```bash
  cat image | llm -m gpt-4o-mini "extract text" --attachment-type - image/jpeg
  ```

  Attachments are also available [in the Python API](https://llm.datasette.io/en/stable/python-api.html#attachments):

  ```python
  model = llm.get_model("gpt-4o-mini")
  response = model.prompt(
      "Describe these images",
      attachments=[
          llm.Attachment(path="pelican.jpg"),
          llm.Attachment(url="https://static.simonwillison.net/static/2024/pelicans.jpg"),
      ]
  )
  ```
  Plugins that provide alternative models can support attachments, see [Attachments for multi-modal models](https://llm.datasette.io/en/stable/plugins/advanced-model-plugins.html) for details.

  The latest **[llm-claude-3](https://github.com/simonw/llm-claude-3)** plugin now supports attachments for Anthropic's Claude 3 and 3.5 models. The **[llm-gemini](https://github.com/simonw/llm-gemini)** plugin supports attachments for Google's Gemini 1.5 models.

  Also in this release: OpenAI models now record their `"usage"` data in the database even when the response was streamed. These records can be viewed using `llm logs --json`. [#591](https://github.com/simonw/llm/issues/591)

reactions:
  {"url": "https://api.github.com/repos/simonw/llm/releases/182377659/reactions", "total_count": 3, "+1": 2, "-1": 0, "laugh": 0, "hooray": 1, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/llm/releases/tag/0.17.1
node_id: RE_kwDOJRhX7M4K6vDL
tag_name: 0.17.1
target_commitish: main
name: 0.17.1
created_at: 2024-11-01T21:21:01Z
published_at: 2024-11-01T21:22:21Z
updated_at: 2024-11-01T21:22:21Z
body:
  - Fixed a bug where `llm chat` crashes if a follow-up prompt is provided. [#601](https://github.com/simonw/llm/issues/601)

reactions:
  {"url": "https://api.github.com/repos/simonw/llm/releases/183169227/reactions", "total_count": 2, "+1": 2, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/sqlite-utils/releases/tag/3.38a0
node_id: RE_kwDOCGYnMM4K_ljc
tag_name: 3.38a0
target_commitish: main
name: 3.38a0
created_at: 2024-11-08T20:13:57Z
published_at: 2024-11-08T20:14:47Z
updated_at: 2024-11-08T20:14:47Z
body:
  - Plugins can now reuse the `sqlite-utils memory` command with the new `return_db=True` parameter. [#643](https://github.com/simonw/sqlite-utils/issues/643)


html_url: https://github.com/simonw/llm/releases/tag/0.18a0
node_id: RE_kwDOJRhX7M4LC9Z_
tag_name: 0.18a0
target_commitish: main
name: 0.18a0
created_at: 2024-11-14T01:55:28Z
published_at: 2024-11-14T01:56:16Z
updated_at: 2024-11-14T01:56:16Z
body:
  Alpha support for **async models**. [#507](https://github.com/simonw/llm/issues/507)

  Multiple [smaller changes](https://github.com/simonw/llm/compare/0.17.1...0.18a0).


html_url: https://github.com/simonw/llm/releases/tag/0.18a1
node_id: RE_kwDOJRhX7M4LDxBR
tag_name: 0.18a1
target_commitish: main
name: 0.18a1
created_at: 2024-11-14T23:10:39Z
published_at: 2024-11-14T23:11:04Z
updated_at: 2024-11-14T23:11:04Z
body:
  - Fixed bug where conversations did not work for async OpenAI models. [#632](https://github.com/simonw/llm/issues/632)
  - `__repr__` methods for `Response` and `AsyncResponse`.


html_url: https://github.com/simonw/llm/releases/tag/0.18
node_id: RE_kwDOJRhX7M4LE6aK
tag_name: 0.18
target_commitish: main
name: 0.18
created_at: 2024-11-17T20:31:48Z
published_at: 2024-11-17T20:33:18Z
updated_at: 2024-11-17T20:33:18Z
body:
  - Initial support for async models. Plugins can now provide an `AsyncModel` subclass that can be accessed in the Python API using the new `llm.get_async_model(model_id)` method. See [async models in the Python API docs](https://llm.datasette.io/en/stable/python-api.html#python-api-async) and [implementing async models in plugins](https://llm.datasette.io/en/stable/plugins/advanced-model-plugins.html#advanced-model-plugins-async). [#507](https://github.com/simonw/llm/issues/507)
  - OpenAI models all now include async models, so function calls such as `llm.get_async_model("gpt-4o-mini")` will return an async model.
  - `gpt-4o-audio-preview` model can be used to send audio attachments to the GPT-4o audio model. [#608](https://github.com/simonw/llm/issues/608)
  - Attachments can now be sent without requiring a prompt. [#611](https://github.com/simonw/llm/issues/611)
  - `llm models --options` now includes information on whether a model supports attachments. [#612](https://github.com/simonw/llm/issues/612)
  - `llm models --async` shows available async models.
  - Custom OpenAI-compatible models can now be marked as `can_stream: false` in the YAML if they do not support streaming. Thanks, [Chris Mungall](https://github.com/cmugall). [#600](https://github.com/simonw/llm/pull/600)
  - Fixed bug where OpenAI usage data was incorrectly serialized to JSON. [#614](https://github.com/simonw/llm/issues/614)
  - Standardized on `audio/wav` MIME type for audio attachments rather than `audio/wave`. [#603](https://github.com/simonw/llm/issues/603


html_url: https://github.com/simonw/llm/releases/tag/0.19a0
node_id: RE_kwDOJRhX7M4LGyn5
tag_name: 0.19a0
target_commitish: main
name: 0.19a0
created_at: 2024-11-20T04:23:54Z
published_at: 2024-11-20T04:25:06Z
updated_at: 2024-11-20T04:25:06Z
body:
  -   Tokens used by a response are now logged to new `input_tokens` and `output_tokens` integer columns and a `token_details` JSON string column, for the default OpenAI models and models from other plugins that [implement this feature](https://llm.datasette.io/en/latest/plugins/advanced-model-plugins.html#advanced-model-plugins-usage). [#610](https://github.com/simonw/llm/issues/610)
  -   `llm prompt` now takes a `-u/--usage` flag to display token usage at the end of the response.
  -   `llm logs -u/--usage` shows token usage information for logged responses.
  -   `llm prompt ... --async` responses are now logged to the database. [#641](https://github.com/simonw/llm/issues/641)


html_url: https://github.com/simonw/llm/releases/tag/0.19a1
node_id: RE_kwDOJRhX7M4LG0c4
tag_name: 0.19a1
target_commitish: main
name: 0.19a1
created_at: 2024-11-20T05:28:01Z
published_at: 2024-11-20T05:28:37Z
updated_at: 2024-11-20T05:28:37Z
body:
  - `response.usage()` and async response `await response.usage()` methods, returning a `Usage(input=2, output=1, details=None)` dataclass. [#644](https://github.com/simonw/llm/issues/644)


html_url: https://github.com/simonw/llm/releases/tag/0.19a2
node_id: RE_kwDOJRhX7M4LHosZ
tag_name: 0.19a2
target_commitish: main
name: 0.19a2
created_at: 2024-11-21T04:12:43Z
published_at: 2024-11-21T04:13:44Z
updated_at: 2024-11-21T04:13:44Z
body:
  -   `llm.get_models()` and `llm.get_async_models()` functions, [documented here](https://llm.datasette.io/en/latest/python-api.html#python-api-listing-models). [#640](https://github.com/simonw/llm/issues/640)

reactions:
  {"url": "https://api.github.com/repos/simonw/llm/releases/186551065/reactions", "total_count": 1, "+1": 1, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/sqlite-utils/releases/tag/3.38
node_id: RE_kwDOCGYnMM4LJ2uq
tag_name: 3.38
target_commitish: main
name: 3.38
created_at: 2024-11-23T22:38:40Z
published_at: 2024-11-23T22:40:30Z
updated_at: 2024-11-23T22:40:30Z
body:
  -   Plugins can now reuse the implementation of the `sqlite-utils memory` CLI command with the new `return_db=True` parameter. ([#643](https://github.com/simonw/sqlite-utils/issues/643))
  -   `table.transform()` now recreates indexes after transforming a table. A new `sqlite_utils.db.TransformError` exception is raised if these indexes cannot be recreated due to conflicting changes to the table such as a column rename. Thanks, [Mat Miller](https://github.com/matdmiller). ([#633](https://github.com/simonw/sqlite-utils/issues/633))
  -   `table.search()` now accepts a `include_rank=True` parameter, causing the resulting rows to have a `rank` column showing the calculated relevance score. Thanks, [liunux4odoo](https://github.com/liunux4odoo). ([#628](https://github.com/simonw/sqlite-utils/pull/628))
  -   Fixed an error that occurred when creating a strict table with at least one floating point column. These `FLOAT` columns are now correctly created as `REAL` as well, but only for strict tables. ([#644](https://github.com/simonw/sqlite-utils/issues/644))


html_url: https://github.com/simonw/datasette/releases/tag/0.65.1
node_id: RE_kwDOBm6k_c4LNneB
tag_name: 0.65.1
target_commitish: 0.64.x
name: 0.65.1
created_at: 2024-11-29T01:11:46Z
published_at: 2024-11-29T01:13:13Z
updated_at: 2024-11-29T01:13:13Z
body:
  - Fixed bug with upgraded HTTPX 0.28.0 dependency. [#2443](https://github.com/simonw/datasette/issues/2443)


html_url: https://github.com/simonw/llm/releases/tag/0.19
node_id: RE_kwDOJRhX7M4LOlvY
tag_name: 0.19
target_commitish: main
name: 0.19
created_at: 2024-12-01T23:58:27Z
published_at: 2024-12-01T23:59:40Z
updated_at: 2024-12-01T23:59:40Z
body:
  -   Tokens used by a response are now logged to new `input_tokens` and `output_tokens` integer columns and a `token_details` JSON string column, for the default OpenAI models and models from other plugins that [implement this feature](https://llm.datasette.io/en/stable/plugins/advanced-model-plugins.html#advanced-model-plugins-usage). [#610](https://github.com/simonw/llm/issues/610)
  -   `llm prompt` now takes a `-u/--usage` flag to display token usage at the end of the response.
  -   `llm logs -u/--usage` shows token usage information for logged responses.
  -   `llm prompt ... --async` responses are now logged to the database. [#641](https://github.com/simonw/llm/issues/641)
  -   `llm.get_models()` and `llm.get_async_models()` functions, [documented here](https://llm.datasette.io/en/stable/python-api.html#python-api-listing-models). [#640](https://github.com/simonw/llm/issues/640)
  -   `response.usage()` and async response `await response.usage()` methods, returning a `Usage(input=2, output=1, details=None)` dataclass. [#644](https://github.com/simonw/llm/issues/644)
  -   `response.on_done(callback)` and `await response.on_done(callback)` methods for specifying a callback to be executed when a response has completed, [documented here](https://llm.datasette.io/en/stable/python-api.html#python-api-response-on-done). [#653](https://github.com/simonw/llm/issues/653)
  -   Fix for bug running `llm chat` on Windows 11. Thanks, [Sukhbinder Singh](https://github.com/sukhbinder). [#495](https://github.com/simonw/llm/issues/495)

reactions:
  {"url": "https://api.github.com/repos/simonw/llm/releases/188373976/reactions", "total_count": 4, "+1": 2, "-1": 0, "laugh": 0, "hooray": 1, "confused": 0, "heart": 0, "rocket": 1, "eyes": 0}


html_url: https://github.com/simonw/llm/releases/tag/0.19.1
node_id: RE_kwDOJRhX7M4LSD6w
tag_name: 0.19.1
target_commitish: main
name: 0.19.1
created_at: 2024-12-05T21:47:28Z
published_at: 2024-12-05T21:47:52Z
updated_at: 2024-12-05T21:47:52Z
body:
  - FIxed bug where `llm.get_models()` and `llm.get_async_models()` returned the same model multiple times. [#667](https://github.com/simonw/llm/issues/667)


html_url: https://github.com/datasette/datasette-enrichments/releases/tag/0.5a0
node_id: RE_kwDOG0Ywas4Lm7aU
tag_name: 0.5a0
target_commitish: main
name: 0.5a0
created_at: 2025-01-14T18:42:17Z
published_at: 2025-01-14T18:46:00Z
updated_at: 2025-01-14T18:46:00Z
body:
  - New `/-/enrich/databasename/-/jobs` listing page `/-/enrich/databasename/-/jobs/123` detail page. [#51](https://github.com/datasette/datasette-enrichments/issues/51)
  - Visible progress bar on tables that have enrichments running. [#52](https://github.com/datasette/datasette-enrichments/issues/52)
  - Table and database action menu items to view previous runs. [#53](https://github.com/datasette/datasette-enrichments/issues/53)
  - Continue any enrichment runs after a server restart. [#54](https://github.com/datasette/datasette-enrichments/issues/54)


html_url: https://github.com/datasette/datasette-enrichments/releases/tag/0.5a1
node_id: RE_kwDOG0Ywas4Ln0Le
tag_name: 0.5a1
target_commitish: main
name: 0.5a1
created_at: 2025-01-15T19:23:29Z
published_at: 2025-01-15T19:25:11Z
updated_at: 2025-01-15T19:25:11Z
body:
  - Pause, resume, cancel buttons for jobs. [#17](https://github.com/datasette/datasette-enrichments/issues/17)
  - Enrichments can raise `self.Pause("message")` or `self.Cancel("message")` exceptions inside their `enrich_batch()` methods. [#56](https://github.com/datasette/datasette-enrichments/issues/56)


html_url: https://github.com/datasette/datasette-enrichments/releases/tag/0.5
node_id: RE_kwDOG0Ywas4Ln3qH
tag_name: 0.5
target_commitish: main
name: 0.5
created_at: 2025-01-15T20:56:11Z
published_at: 2025-01-15T20:56:35Z
updated_at: 2025-01-15T20:56:35Z
body:
  - UI for viewing status of enrichment jobs. [#51](https://github.com/datasette/datasette-enrichments/issues/51)
  - Pause, resume and cancel buttons. [#17](https://github.com/datasette/datasette-enrichments/issues/17)
  - Visible progress bar on table with running enrichments. [#52](https://github.com/datasette/datasette-enrichments/issues/52)
  - Table and database action menu items for viewing enrichment runs. [#53](https://github.com/datasette/datasette-enrichments/issues/53)
  - Enrichments continue running after a server restart. [#54](https://github.com/datasette/datasette-enrichments/issues/54)
  - An `enrichment` permission is now correctly registered with Datasette 1.0a+. [#55](https://github.com/datasette/datasette-enrichments/issues/55)
  - Enrichments can pause or cancel themselves by raising the new `self.Pause(reason)` and `self.Cancel(reason)` exceptions. [#56](https://github.com/datasette/datasette-enrichments/issues/56)


html_url: https://github.com/simonw/llm/releases/tag/0.20
node_id: RE_kwDOJRhX7M4Ls8RO
tag_name: 0.20
target_commitish: main
name: 0.20
created_at: 2025-01-23T04:46:28Z
published_at: 2025-01-23T04:47:07Z
updated_at: 2025-01-23T05:05:30Z
body:
  - New model, `o1`. This model does not yet support streaming. [#676](https://github.com/simonw/llm/issues/676)
  - `o1-preview` and `o1-mini` models now support streaming.
  - New models, `gpt-4o-audio-preview` and `gpt-4o-mini-audio-preview`. [#677](https://github.com/simonw/llm/issues/677)
  - `llm prompt -x/--extract` option, which returns just the content of the first fenced code block in the response. Try `llm prompt -x 'Python function to reverse a string'`. [#681](https://github.com/simonw/llm/issues/681)
    - Creating a template using `llm ... --save x` now supports the `-x/--extract` option, which is saved to the template. YAML templates can set this option using `extract: true`.
    - New `llm logs -x/--extract` option extracts the first fenced code block from matching logged responses.
  - New `llm models -q 'search'` option returning models that case-insensitively match the search query. [#700](https://github.com/simonw/llm/issues/700)
  - Installation documentation now also includes `uv`. Thanks, [Ariel Marcus](https://github.com/ajmarcus). [#690](https://github.com/simonw/llm/pull/690) and [#702](https://github.com/simonw/llm/issues/702)
  - `llm models` command now shows the current default model at the bottom of the listing. Thanks, [Amjith Ramanujam](https://github.com/amjith). [#688](https://github.com/simonw/llm/pull/688)
  - [Plugin directory](https://llm.datasette.io/en/stable/plugins/directory.html) now includes `llm-venice`, `llm-bedrock`, `llm-deepseek` and `llm-cmd-comp`.
  - Fixed bug where some dependency version combinations could cause a `Client.__init__() got an unexpected keyword argument 'proxies'` error. [#709](https://github.com/simonw/llm/issues/709)
  - OpenAI embedding models are now available using their full names of `text-embedding-ada-002`, `text-embedding-3-small` and `text-embedding-3-large` - the previous names are still supported as aliases. Thanks, [web-sst](https://github.com/web-sst). [#654](https://github.com/simonw/llm/pull/654)

reactions:
  {"url": "https://api.github.com/repos/simonw/llm/releases/196330574/reactions", "total_count": 7, "+1": 7, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/llm/releases/tag/0.21
node_id: RE_kwDOJRhX7M4LyyJ_
tag_name: 0.21
target_commitish: main
name: 0.21
created_at: 2025-01-31T20:35:10Z
published_at: 2025-01-31T20:36:37Z
updated_at: 2025-01-31T20:36:37Z
body:
  - New model: `o3-mini`. [#728](https://github.com/simonw/llm/issues/728)
  - The `o3-mini` and `o1` models now support a `reasoning_effort` option which can be set to `low`, `medium` or `high`.
  - `llm prompt` and `llm logs` now have a `--xl/--extract-last` option for extracting the last fenced code block in the response - a complement to the existing `--x/--extract` option. [#717](https://github.com/simonw/llm/issues/717)

reactions:
  {"url": "https://api.github.com/repos/simonw/llm/releases/197862015/reactions", "total_count": 3, "+1": 1, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 2, "rocket": 0, "eyes": 0}


html_url: https://github.com/simonw/datasette/releases/tag/1.0a17
node_id: RE_kwDOBm6k_c4L2win
tag_name: 1.0a17
target_commitish: main
name: 1.0a17
created_at: 2025-02-06T19:12:34Z
published_at: 2025-02-06T19:14:10Z
updated_at: 2025-02-06T19:14:10Z
body:
  - `DATASETTE_SSL_KEYFILE` and `DATASETTE_SSL_CERTFILE` environment variables as alternatives to `--ssl-keyfile` and `--ssl-certfile`. Thanks, Alex Garcia. ([#2422](https://github.com/simonw/datasette/issues/2422))
  - `SQLITE_EXTENSIONS` environment variable has been renamed to `DATASETTE_LOAD_EXTENSION`. ([#2424](https://github.com/simonw/datasette/issues/2424))
  - `datasette serve` environment variables are now [documented here](https://docs.datasette.io/en/latest/cli-reference.html#cli-datasette-serve-env).
  - The [register_magic_parameters(datasette)](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-register-magic-parameters) plugin hook can now register async functions. ([#2441](https://github.com/simonw/datasette/issues/2441))
  - Datasette is now tested against Python 3.13.
  - Breadcrumbs on database and table pages now include a consistent self-link for resetting query string parameters. ([#2454](https://github.com/simonw/datasette/issues/2454))
  - Fixed issue where Datasette could crash on `metadata.json` with nested values. ([#2455](https://github.com/simonw/datasette/issues/2455))
  - New internal methods `datasette.set_actor_cookie()` and `datasette.delete_actor_cookie()`, [described here](https://docs.datasette.io/en/latest/authentication.html#authentication-ds-actor). ([#1690](https://github.com/simonw/datasette/issues/1690))
  - `/-/permissions` page now shows a list of all permissions registered by plugins. ([#1943](https://github.com/simonw/datasette/issues/1943))
  - If a table has a single unique text column Datasette now detects that as the foreign key label for that table. ([#2458](https://github.com/simonw/datasette/issues/2458))
  - The `/-/permissions` page now includes options for filtering or exclude permission checks recorded against the current user. ([#2460](https://github.com/simonw/datasette/issues/2460))
  - Fixed a bug where replacing a database with a new one with the same name did not pick up the new database correctly. ([#2465](https://github.com/simonw/datasette/issues/2465))


html_url: https://github.com/datasette/datasette-public/releases/tag/0.3a0
node_id: RE_kwDOIIe2Hs4L25pz
tag_name: 0.3a0
target_commitish: main
name: 0.3a0
created_at: 2025-02-06T23:08:58Z
published_at: 2025-02-06T23:10:42Z
updated_at: 2025-02-06T23:10:42Z
body:
  - Added the ability to make full databases public, including setting if users can execute SQL or not. [#9](https://github.com/datasette/datasette-public/issues/9)
  - Now depends on Datasette 1.0a and uses the new `internal` database. [#6](https://github.com/datasette/datasette-public/issues/6)


