` element, to help with advanced CSS customization. ([#1446](https://github.com/simonw/datasette/issues/1446))
- The [render_cell()](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-render-cell) plugin hook can now return an awaitable function. This means the hook can execute SQL queries. ([#1425](https://github.com/simonw/datasette/issues/1425))
- [register_routes(datasette)](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-register-routes) plugin hook now accepts an optional `datasette` argument. ([#1404](https://github.com/simonw/datasette/issues/1404))
- New `hide_sql` canned query option for defaulting to hiding the SQL quey used by a canned query, see [Additional canned query options](https://docs.datasette.io/en/stable/sql_queries.html#canned-queries-options). ([#1422](https://github.com/simonw/datasette/issues/1422))
- New `--cpu` option for [datasette publish cloudrun](https://docs.datasette.io/en/stable/publish.html#publish-cloud-run). ([#1420](https://github.com/simonw/datasette/issues/1420))
- If [Rich](https://github.com/willmcgugan/rich) is installed in the same virtual environment as Datasette, it will be used to provide enhanced display of error tracebacks on the console. ([#1416](https://github.com/simonw/datasette/issues/1416))
- `datasette.utils` [parse_metadata(content)](https://docs.datasette.io/en/stable/internals.html#internals-utils-parse-metadata) function, used by the new [datasette-remote-metadata plugin](https://datasette.io/plugins/datasette-remote-metadata), is now a documented API. ([#1405](https://github.com/simonw/datasette/issues/1405))
- Fixed bug where `?_next=x&_sort=rowid` could throw an error. ([#1470](https://github.com/simonw/datasette/issues/1470))
- Column cog menu no longer shows the option to facet by a column that is already selected by the default facets in metadata. ([#1469](https://github.com/simonw/datasette/issues/1469))",107914493,datasette,"{""url"": ""https://api.github.com/repos/simonw/datasette/releases/51387349/reactions"", ""total_count"": 1, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 1, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}"
https://github.com/simonw/sqlite-utils/releases/tag/3.17.1,50089123,RE_kwDOCGYnMM4C_Eyj,3.17.1,main,3.17.1,0,9599,simonw,0,2021-09-22T20:49:36Z,2021-09-22T20:51:04Z,"- [sqlite-utils memory](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-memory) now works if files passed to it share the same file name. ([#325](https://github.com/simonw/sqlite-utils/issues/325))
- [sqlite-utils query](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-query) now returns `[]` in JSON mode if no rows are returned. ([#328](https://github.com/simonw/sqlite-utils/issues/328))",140912432,sqlite-utils,
https://github.com/dogsheep/twitter-to-sqlite/releases/tag/0.22,50003635,RE_kwDODEm0Qs4C-v6z,0.22,main,0.22,0,9599,simonw,0,2021-09-21T17:39:08Z,2021-09-21T17:41:05Z,"- `twitter-to-sqlite import` now imports `app.js` to `archive_app` table.
- Small fixes for `twitter-to-sqlite import` reflecting changed filenames in the Twitter export.
- Fix for remaining `since_id` bug, thanks Ruben Vermeersch! [#58](https://github.com/dogsheep/twitter-to-sqlite/issues/58)",206156866,twitter-to-sqlite,"{""url"": ""https://api.github.com/repos/dogsheep/twitter-to-sqlite/releases/50003635/reactions"", ""total_count"": 1, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 1, ""rocket"": 0, ""eyes"": 0}"
https://github.com/simonw/datasette/releases/tag/0.59a2,48604143,MDc6UmVsZWFzZTQ4NjA0MTQz,0.59a2,main, 0.59a2,0,9599,simonw,1,2021-08-28T01:55:54Z,2021-08-28T01:57:38Z,"- Columns can now have associated metadata descriptions in `metadata.json`, see [Column descriptions](https://docs.datasette.io/en/latest/metadata.html#metadata-column-descriptions). ([#942](https://github.com/simonw/datasette/issues/942))
- New [register_commands()](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-register-commands) plugin hook allows plugins to register additional Datasette CLI commands, e.g. `datasette mycommand file.db`. ([#1449](https://github.com/simonw/datasette/issues/1449))
- Adding `?_facet_size=max` to a table page now shows the number of unique values in each facet. ([#1423](https://github.com/simonw/datasette/issues/1423))
- Code that figures out which named parameters a SQL query takes in order to display form fields for them is no longer confused by strings that contain colon characters. ([#1421](https://github.com/simonw/datasette/issues/1421))
- Renamed `--help-config` option to `--help-settings`. ([#1431](https://github.com/simonw/datasette/issues/1431))
- `datasette.databases` property is now a documented API. ([#1443](https://github.com/simonw/datasette/issues/1443))
- Datasette base template now wraps everything other than the `
` in a `` element, to help with advanced CSS customization. ([#1446](https://github.com/simonw/datasette/issues/1446))",107914493,datasette,
https://github.com/dogsheep/evernote-to-sqlite/releases/tag/0.3.2,48523966,MDc6UmVsZWFzZTQ4NTIzOTY2,0.3.2,main,0.3.2,0,9599,simonw,0,2021-08-26T19:01:49Z,2021-08-26T19:02:47Z,- Fixed error when encountering `` documents that were not well-formed XML. [#13](https://github.com/dogsheep/evernote-to-sqlite/issues/13),303218369,evernote-to-sqlite,
https://github.com/simonw/sqlite-utils/releases/tag/3.17,48389722,MDc6UmVsZWFzZTQ4Mzg5NzIy,3.17,main,3.17,0,9599,simonw,0,2021-08-24T23:40:18Z,2021-08-24T23:42:22Z,"- The [sqlite-utils memory](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-memory) command has a new `--analyze` option, which runs the equivalent of the [analyze-tables](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-analyze-tables) command directly against the in-memory database created from the incoming CSV or JSON data. ([#320](https://github.com/simonw/sqlite-utils/issues/320))
- [sqlite-utils insert-files](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-insert-files) now has the ability to insert file contents in to `TEXT` columns in addition to the default `BLOB`. Pass the `--text` option or use `content_text` as a column specifier. ([#319](https://github.com/simonw/sqlite-utils/issues/319))",140912432,sqlite-utils,"{""url"": ""https://api.github.com/repos/simonw/sqlite-utils/releases/48389722/reactions"", ""total_count"": 1, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 1, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}"
https://github.com/dogsheep/healthkit-to-sqlite/releases/tag/1.0.1,48151477,MDc6UmVsZWFzZTQ4MTUxNDc3,1.0.1,main,1.0.1,0,9599,simonw,0,2021-08-20T00:55:29Z,2021-08-20T00:56:17Z,- Fixed bug where `activity_summary` table could fail to be built with an error. [#19](https://github.com/dogsheep/healthkit-to-sqlite/issues/19),197882382,healthkit-to-sqlite,
https://github.com/dogsheep/twitter-to-sqlite/releases/tag/0.21.4,48150315,MDc6UmVsZWFzZTQ4MTUwMzE1,0.21.4,main,0.21.4,0,9599,simonw,0,2021-08-20T00:14:08Z,2021-08-20T00:14:30Z,"- Fix for `since_id` error with `user-timeline`. [#57](https://github.com/dogsheep/twitter-to-sqlite/issues/57)
- Document the use of `--stop_after` with favorites - thanks, Mike Lee Williams. [#49](https://github.com/dogsheep/twitter-to-sqlite/pull/49)
- Fixes for Twitter archive imports, thanks Jacob Kaplan-Moss. [#55](https://github.com/dogsheep/twitter-to-sqlite/pull/55)
",206156866,twitter-to-sqlite,
https://github.com/simonw/sqlite-utils/releases/tag/3.16,48077246,MDc6UmVsZWFzZTQ4MDc3MjQ2,3.16,main,3.16,0,9599,simonw,0,2021-08-18T22:36:32Z,2021-08-18T22:37:55Z,"- Type signatures added to more methods, including `table.resolve_foreign_keys()`, `db.create_table_sql()`, `db.create_table()` and `table.create()`. ([#314](https://github.com/simonw/sqlite-utils/issues/314))
- New `db.quote_fts(value)` method, see [Quoting characters for use in search](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-quote-fts) - thanks, Mark Neumann. ([#246](https://github.com/simonw/sqlite-utils/issues/246))
- `table.search()` now accepts an optional `quote=True` parameter. ([#296](https://github.com/simonw/sqlite-utils/issues/296))
- CLI command `sqlite-utils search` now accepts a `--quote` option. ([#296](https://github.com/simonw/sqlite-utils/issues/296))
- Fixed bug where `--no-headers` and `--tsv` options to [sqlite-utils insert](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-insert-csv-tsv) could not be used together. ([#295](https://github.com/simonw/sqlite-utils/issues/295))
- Various small improvements to [API reference](https://sqlite-utils.datasette.io/en/stable/reference.html#reference) documentation.",140912432,sqlite-utils,
https://github.com/simonw/sqlite-utils/releases/tag/3.15.1,47636109,MDc6UmVsZWFzZTQ3NjM2MTA5,3.15.1,main,3.15.1,0,9599,simonw,0,2021-08-10T23:55:12Z,2021-08-10T23:55:38Z,"- Python library now includes type annotations on almost all of the methods, plus detailed docstrings describing each one. ([#311](https://github.com/simonw/sqlite-utils/issues/311))
- New [API Reference](https://sqlite-utils.datasette.io/en/stable/reference.html) documentation page, powered by those docstrings.
- Fixed bug where `.add_foreign_keys()` failed to raise an error if called against a `View`. ([#313](https://github.com/simonw/sqlite-utils/issues/313))
- Fixed bug where `.delete_where()` returned a `[]` instead of returning `self` if called against a non-existant table. ([#315](https://github.com/simonw/sqlite-utils/issues/315))",140912432,sqlite-utils,"{""url"": ""https://api.github.com/repos/simonw/sqlite-utils/releases/47636109/reactions"", ""total_count"": 1, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 1, ""rocket"": 0, ""eyes"": 0}"
https://github.com/simonw/sqlite-utils/releases/tag/3.15,47569134,MDc6UmVsZWFzZTQ3NTY5MTM0,3.15,main,3.15,0,9599,simonw,0,2021-08-09T22:42:06Z,2021-08-09T22:43:16Z,"- `sqlite-utils insert --flatten` option for [flattening nested JSON objects](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-inserting-data-flatten) to create tables with column names like `topkey_nestedkey`. ([#310](https://github.com/simonw/sqlite-utils/issues/310))
- Fixed several spelling mistakes in the documentation, spotted [using codespell](https://til.simonwillison.net/python/codespell).
- Errors that occur while using the `sqlite-utils` CLI tool now show the responsible SQL and query parameters, if possible. ([#309](https://github.com/simonw/sqlite-utils/issues/309))",140912432,sqlite-utils,
https://github.com/simonw/datasette/releases/tag/0.59a1,47507174,MDc6UmVsZWFzZTQ3NTA3MTc0,0.59a1,main,0.59a1,0,9599,simonw,1,2021-08-09T01:13:03Z,2021-08-09T01:14:06Z,- The [render_cell()](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-render-cell) plugin hook can now return an awaitable function. This means the hook can execute SQL queries. ([#1425](https://github.com/simonw/datasette/issues/1425)),107914493,datasette,"{""url"": ""https://api.github.com/repos/simonw/datasette/releases/47507174/reactions"", ""total_count"": 1, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 1, ""rocket"": 0, ""eyes"": 0}"
https://github.com/simonw/datasette/releases/tag/0.59a0,47461737,MDc6UmVsZWFzZTQ3NDYxNzM3,0.59a0,main,0.59a0,0,9599,simonw,1,2021-08-07T05:40:07Z,2021-08-07T05:42:25Z,"- [register_routes(datasette)](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-register-routes) plugin hook now accepts an optional `datasette` argument. ([#1404](https://github.com/simonw/datasette/issues/1404))
- New `hide_sql` canned query option for defaulting to hiding the SQL quey used by a canned query, see [Additional canned query options](https://docs.datasette.io/en/latest/sql_queries.html#canned-queries-options). ([#1422](https://github.com/simonw/datasette/issues/1422))
- New `--cpu` option for [datasette publish cloudrun](https://docs.datasette.io/en/latest/publish.html#publish-cloud-run). ([#1420](https://github.com/simonw/datasette/issues/1420))
- If [Rich](https://github.com/willmcgugan/rich) is installed in the same virtual environment as Datasette, it will be used to provide enhanced display of error tracebacks on the console. ([#1416](https://github.com/simonw/datasette/issues/1416))
- `datasette.utils` [parse_metadata(content)](https://docs.datasette.io/en/latest/internals.html#internals-utils-parse-metadata) function, used by the new [datasette-remote-metadata plugin](https://datasette.io/plugins/datasette-remote-metadata), is now a documented API. ([#1405](https://github.com/simonw/datasette/issues/1405))",107914493,datasette,
https://github.com/simonw/sqlite-utils/releases/tag/3.14,47185841,MDc6UmVsZWFzZTQ3MTg1ODQx,3.14,main,3.14,0,9599,simonw,0,2021-08-02T21:29:16Z,2021-08-02T21:34:43Z,"This release introduces the new [sqlite-utils convert command](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-convert) ([#251](https://github.com/simonw/sqlite-utils/issues/251)) and corresponding [table.convert(...)](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-convert) Python method ([#302](https://github.com/simonw/sqlite-utils/issues/302)). These tools can be used to apply a Python conversion function to one or more columns of a table, either updating the column in place or using transformed data from that column to populate one or more other columns.
This command-line example uses the Python standard library [textwrap module](https://docs.python.org/3/library/textwrap.html) to wrap the content of the `content` column in the `articles` table to 100 characters:
```
$ sqlite-utils convert content.db articles content\
'""\n"".join(textwrap.wrap(value, 100))'\
--import=textwrap
```
The same operation in Python code looks like this:
```python
import sqlite_utils, textwrap
db = sqlite_utils.Database(""content.db"")
db[""articles""].convert(""content"", lambda v: ""\n"".join(textwrap.wrap(v, 100)))
```
See the full documentation for the [sqlite-utils convert command](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-convert) and the [table.convert(...)](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-convert) Python method for more details.
Also in this release:
- The new `table.count_where(...)` method, for counting rows in a table that match a specific SQL `WHERE` clause. ([#305](https://github.com/simonw/sqlite-utils/issues/305))
- New `--silent` option for the [sqlite-utils insert-files command](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-insert-files) to hide the terminal progress bar, consistent with the `--silent` option for `sqlite-utils convert`. ([#301](https://github.com/simonw/sqlite-utils/issues/301))",140912432,sqlite-utils,
https://github.com/simonw/sqlite-utils/releases/tag/3.13,46720847,MDc6UmVsZWFzZTQ2NzIwODQ3,3.13,main,3.13,0,9599,simonw,0,2021-07-24T22:15:27Z,2021-07-24T22:17:47Z,"- `sqlite-utils schema my.db table1 table2` command now accepts optional table names. ([#299](https://github.com/simonw/sqlite-utils/issues/299))
- `sqlite-utils memory --help` now describes the `--schema` option.",140912432,sqlite-utils,
https://github.com/simonw/datasette/releases/tag/0.58.1,46341814,MDc6UmVsZWFzZTQ2MzQxODE0,0.58.1,main,0.58.1,0,9599,simonw,0,2021-07-16T19:50:06Z,2021-07-16T19:51:15Z,- Fix for an intermittent race condition caused by the `refresh_schemas()` internal function. ([#1231](https://github.com/simonw/datasette/issues/1231)),107914493,datasette,
https://github.com/simonw/datasette/releases/tag/0.58,46222036,MDc6UmVsZWFzZTQ2MjIyMDM2,0.58,main,0.58,0,9599,simonw,0,2021-07-15T00:33:04Z,2021-07-15T00:37:57Z,"- New `datasette --uds /tmp/datasette.sock` option for binding Datasette to a Unix domain socket, see [proxy documentation](https://docs.datasette.io/en/stable/deploying.html#deploying-proxy). ([#1388](https://github.com/simonw/datasette/issues/1388))
- `""searchmode"": ""raw""` table metadata option for defaulting a table to executing SQLite full-text search syntax without first escaping it, see [Advanced SQLite search queries](https://docs.datasette.io/en/stable/full_text_search.html#full-text-search-advanced-queries). ([#1389](https://github.com/simonw/datasette/issues/1389))
- New plugin hook: [get_metadata(datasette, key, database, table)](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-get-metadata), for returning custom metadata for an instance, database or table. Thanks, Brandon Roberts! ([#1384](https://github.com/simonw/datasette/issues/1384))
- New plugin hook: [skip_csrf(datasette, scope)](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-skip-csrf), for opting out of CSRF protection based on the incoming request. ([#1377](https://github.com/simonw/datasette/issues/1377))
- The [menu_links()](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-menu-links), [table_actions()](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-table-actions) and [database_actions()](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-database-actions) plugin hooks all gained a new optional `request` argument providing access to the current request. ([#1371](https://github.com/simonw/datasette/issues/1371))
- Major performance improvement for Datasette faceting. ([#1394](https://github.com/simonw/datasette/issues/1394))
- Improved documentation for [Running Datasette behind a proxy](https://docs.datasette.io/en/stable/deploying.html#deploying-proxy) to recommend using `ProxyPreservehost On` with Apache. ([#1387](https://github.com/simonw/datasette/issues/1387))
- `POST` requests to endpoints that do not support that HTTP verb now return a 405 error.
- `db.path` can now be provided as a `pathlib.Path` object, useful when writing unit tests for plugins. Thanks, Chris Amico. ([#1365](https://github.com/simonw/datasette/issues/1365))",107914493,datasette,
https://github.com/simonw/sqlite-utils/releases/tag/3.12,45251624,MDc6UmVsZWFzZTQ1MjUxNjI0,3.12,main,3.12,0,9599,simonw,0,2021-06-25T17:59:05Z,2021-06-25T18:00:18Z,"- New [db.query(sql, params)](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-query) method, which executes a SQL query and returns the results as an iterator over Python dictionaries. ([#290](https://github.com/simonw/sqlite-utils/issues/290))
- This project now uses `flake8` and has started to use `mypy`. ([#291](https://github.com/simonw/sqlite-utils/issues/291))
- New documentation on [contributing](https://sqlite-utils.datasette.io/en/stable/contributing.html#contributing) to this project. ([#292](https://github.com/simonw/sqlite-utils/issues/292))",140912432,sqlite-utils,
https://github.com/simonw/datasette/releases/tag/0.58a1,45182156,MDc6UmVsZWFzZTQ1MTgyMTU2,0.58a1,main,0.58a1,0,9599,simonw,1,2021-06-24T16:24:59Z,2021-06-24T16:29:09Z,"- New plugin hook: [skip_csrf(datasette, scope)](https://docs.datasette.io/en/latest//plugin_hooks.html#plugin-hook-skip-csrf), for opting out of CSRF protection based on the incoming request. ([#1377](https://github.com/simonw/datasette/issues/1377))
- `POST` requests to endpoints that do not support that HTTP verb now return a 405 error.
- `db.path` can now be provided as a `pathlib.Path` object, useful when writing unit tests for plugins. Thanks, Chris Amico. ([#1365](https://github.com/simonw/datasette/issues/1365))",107914493,datasette,"{""url"": ""https://api.github.com/repos/simonw/datasette/releases/45182156/reactions"", ""total_count"": 1, ""+1"": 1, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}"
https://github.com/simonw/sqlite-utils/releases/tag/3.11,44927292,MDc6UmVsZWFzZTQ0OTI3Mjky,3.11,main,3.11,0,9599,simonw,0,2021-06-20T18:52:15Z,2021-06-20T18:53:09Z,"- New `sqlite-utils memory data.csv --schema` option, for outputting the schema of the in-memory database generated from one or more files. See [--schema, --dump and --save](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-memory-schema-dump-save). ([#288](https://github.com/simonw/sqlite-utils/issues/288))
- Added [installation instructions](https://sqlite-utils.datasette.io/en/stable/installation.html#installation). ([#286](https://github.com/simonw/sqlite-utils/issues/286))",140912432,sqlite-utils,
https://github.com/simonw/sqlite-utils/releases/tag/3.10,44904928,MDc6UmVsZWFzZTQ0OTA0OTI4,3.10,main,3.10,0,9599,simonw,0,2021-06-19T16:09:29Z,2021-06-19T16:13:11Z,"This release introduces the `sqlite-utils memory` command, which can be used to load CSV or JSON data into a temporary in-memory database and run SQL queries (including joins across multiple files) directly against that data.
Also new: `sqlite-utils insert --detect-types`, `sqlite-utils dump`, `table.use_rowid` plus some smaller fixes.
### sqlite-utils memory
This example of `sqlite-utils memory` retrieves information about the all of the repositories in the [Dogsheep](https://github.com/dogsheep) organization on GitHub using [this JSON API](https://api.github.com/users/dogsheep/repos), sorts them by their number of stars and outputs a table of the top five (using `-t`):
```
$ curl -s 'https://api.github.com/users/dogsheep/repos'\
| sqlite-utils memory - '
select full_name, forks_count, stargazers_count
from stdin order by stargazers_count desc limit 5
' -t
full_name forks_count stargazers_count
--------------------------------- ------------- ------------------
dogsheep/twitter-to-sqlite 12 225
dogsheep/github-to-sqlite 14 139
dogsheep/dogsheep-photos 5 116
dogsheep/dogsheep.github.io 7 90
dogsheep/healthkit-to-sqlite 4 85
```
The tool works against files on disk as well. This example joins data from two CSV files:
```
$ cat creatures.csv
species_id,name
1,Cleo
2,Bants
2,Dori
2,Azi
$ cat species.csv
id,species_name
1,Dog
2,Chicken
$ sqlite-utils memory species.csv creatures.csv '
select * from creatures join species on creatures.species_id = species.id
'
[{""species_id"": 1, ""name"": ""Cleo"", ""id"": 1, ""species_name"": ""Dog""},
{""species_id"": 2, ""name"": ""Bants"", ""id"": 2, ""species_name"": ""Chicken""},
{""species_id"": 2, ""name"": ""Dori"", ""id"": 2, ""species_name"": ""Chicken""},
{""species_id"": 2, ""name"": ""Azi"", ""id"": 2, ""species_name"": ""Chicken""}]
```
Here the `species.csv` file becomes the `species` table, the `creatures.csv` file becomes the `creatures` table and the output is JSON, the default output format.
You can also use the `--attach` option to attach existing SQLite database files to the in-memory database, in order to join data from CSV or JSON directly against your existing tables.
Full documentation of this new feature is available in [Querying data directly using an in-memory database](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-memory). ([#272](https://github.com/simonw/sqlite-utils/issues/272))
### sqlite-utils insert --detect-types
The [sqlite-utils insert](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-inserting-data) command can be used to insert data from JSON, CSV or TSV files into a SQLite database file. The new `--detect-types` option (shortcut `-d`), when used in conjunction with a CSV or TSV import, will automatically detect if columns in the file are integers or floating point numbers as opposed to treating everything as a text column and create the new table with the corresponding schema. See [Inserting CSV or TSV data](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-insert-csv-tsv) for details. ([#282](https://github.com/simonw/sqlite-utils/issues/282))
### Other changes
- **Bug fix**: `table.transform()`, when run against a table without explicit primary keys, would incorrectly create a new version of the table with an explicit primary key column called `rowid`. ([#284](https://github.com/simonw/sqlite-utils/issues/284))
- New `table.use_rowid` introspection property, see [.use_rowid](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-introspection-use-rowid). ([#285](https://github.com/simonw/sqlite-utils/issues/285))
- The new `sqlite-utils dump file.db` command outputs a SQL dump that can be used to recreate a database. ([#274](https://github.com/simonw/sqlite-utils/issues/274))
- `-h` now works as a shortcut for `--help`, thanks Loren McIntyre. ([#276](https://github.com/simonw/sqlite-utils/issues/276))
- Now using [pytest-cov](https://pytest-cov.readthedocs.io/) and [Codecov](https://about.codecov.io/) to track test coverage - currently at 96%. ([#275](https://github.com/simonw/sqlite-utils/issues/275))
- SQL errors that occur when using `sqlite-utils query` are now displayed as CLI errors.",140912432,sqlite-utils,"{""url"": ""https://api.github.com/repos/simonw/sqlite-utils/releases/44904928/reactions"", ""total_count"": 3, ""+1"": 1, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 1, ""eyes"": 1}"
https://github.com/dogsheep/dogsheep-beta/releases/tag/0.10.2,44537329,MDc6UmVsZWFzZTQ0NTM3MzI5,0.10.2,main,0.10.2,0,9599,simonw,0,2021-06-13T14:37:17Z,2021-06-13T14:38:09Z,- Fixed bug where searches consisting only of whitespace caused a server error. [#33](https://github.com/dogsheep/dogsheep-beta/issues/33),197431109,dogsheep-beta,
https://github.com/simonw/sqlite-utils/releases/tag/3.9.1,44529219,MDc6UmVsZWFzZTQ0NTI5MjE5,3.9.1,main,3.9.1,0,9599,simonw,0,2021-06-13T02:59:08Z,2021-06-13T03:00:45Z,- Fixed bug when using `table.upsert_all()` to create a table with only a single column that is treated as the primary key. ([#271](https://github.com/simonw/sqlite-utils/issues/271)),140912432,sqlite-utils,
https://github.com/simonw/sqlite-utils/releases/tag/3.9,44511190,MDc6UmVsZWFzZTQ0NTExMTkw,3.9,main,3.9,0,9599,simonw,0,2021-06-12T02:07:18Z,2021-06-12T02:08:03Z,"- New `sqlite-utils schema` command showing the full SQL schema for a database, see [Showing the schema (CLI)](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-schema). ([#268](https://github.com/simonw/sqlite-utils/issues/268))
- `db.schema` introspection property exposing the same feature to the Python library, see [Showing the schema (Python library)](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-schema).",140912432,sqlite-utils,"{""url"": ""https://api.github.com/repos/simonw/sqlite-utils/releases/44511190/reactions"", ""total_count"": 1, ""+1"": 1, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}"
https://github.com/simonw/datasette/releases/tag/0.58a0,44388485,MDc6UmVsZWFzZTQ0Mzg4NDg1,0.58a0,main,0.58a0,0,9599,simonw,1,2021-06-10T04:51:14Z,2021-06-10T04:52:45Z,"- The [menu_links()](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-menu-links), [table_actions()](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-table-actions) and [database_actions()](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-database-actions) plugin hooks all gained a new optional `request` argument providing access to the current request. ([#1371](https://github.com/simonw/datasette/issues/1371))",107914493,datasette,
https://github.com/simonw/datasette/releases/tag/0.57.1,44292523,MDc6UmVsZWFzZTQ0MjkyNTIz,0.57.1,main,0.57.1,0,9599,simonw,0,2021-06-08T16:26:45Z,2021-06-08T16:28:31Z,"- Fixed visual display glitch with global navigation menu. ([#1367](https://github.com/simonw/datasette/issues/1367))
- No longer truncates the list of table columns displayed on the `/database` page. ([#1364](https://github.com/simonw/datasette/issues/1364))",107914493,datasette,"{""url"": ""https://api.github.com/repos/simonw/datasette/releases/44292523/reactions"", ""total_count"": 4, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 4, ""rocket"": 0, ""eyes"": 0}"
https://github.com/simonw/datasette/releases/tag/0.57,44155601,MDc6UmVsZWFzZTQ0MTU1NjAx,0.57,main,0.57,0,9599,simonw,0,2021-06-05T22:06:55Z,2021-06-05T22:11:18Z,"**Warning**: This release fixes a [reflected cross-site scripting](https://owasp.org/www-community/attacks/xss/#reflected-xss-attacks) security hole with the `?_trace=1` feature. You should upgrade to this version, or to Datasette 0.56.1, as soon as possible. ([#1360](https://github.com/simonw/datasette/issues/1360))
In addition to the security fix, this release includes `?_col=` and `?_nocol=` options for controlling which columns are displayed for a table, `?_facet_size=` for increasing the number of facet results returned, re-display of your SQL query should an error occur and numerous bug fixes.
### New features
- If an error occurs while executing a user-provided SQL query, that query is now re-displayed in an editable form along with the error message. ([#619](https://github.com/simonw/datasette/issues/619))
- New `?_col=` and `?_nocol=` parameters to show and hide columns in a table, plus an interface for hiding and showing columns in the column cog menu. ([#615](https://github.com/simonw/datasette/issues/615))
- A new `?_facet_size=` parameter for customizing the number of facet results returned on a table or view page. ([#1332](https://github.com/simonw/datasette/issues/1332))
- `?_facet_size=max` sets that to the maximum, which defaults to 1,000 and is controlled by the the [max_returned_rows](https://docs.datasette.io/en/stable/settings.html#setting-max-returned-rows) setting. If facet results are truncated the ... at the bottom of the facet list now links to this parameter. ([#1337](https://github.com/simonw/datasette/issues/1337))
- `?_nofacet=1` option to disable all facet calculations on a page, used as a performance optimization for CSV exports and `?_shape=array/object`. ([#1349](https://github.com/simonw/datasette/issues/1349), [#263](https://github.com/simonw/datasette/issues/263))
- `?_nocount=1` option to disable full query result counts. ([#1353](https://github.com/simonw/datasette/issues/1353))
- `?_trace=1` debugging option is now controlled by the new [trace_debug](https://docs.datasette.io/en/stable/settings.html#setting-trace-debug) setting, which is turned off by default. ([#1359](https://github.com/simonw/datasette/issues/1359))
### Bug fixes and other improvements
- [Custom pages](https://docs.datasette.io/en/stable/custom_templates.html#custom-pages) now work correctly when combined with the [base_url](https://docs.datasette.io/en/stable/settings.html#setting-base-url) setting. ([#1238](https://github.com/simonw/datasette/issues/1238))
- Fixed intermittent error displaying the index page when the user did not have permission to access one of the tables. Thanks, Guy Freeman. ([#1305](https://github.com/simonw/datasette/issues/1305))
- Columns with the name ""Link"" are no longer incorrectly displayed in bold. ([#1308](https://github.com/simonw/datasette/issues/1308))
- Fixed error caused by tables with a single quote in their names. ([#1257](https://github.com/simonw/datasette/issues/1257))
- Updated dependencies: `pytest-asyncio`, `Black`, `jinja2`, `aiofiles`, `click`, and `itsdangerous`.
- The official Datasette Docker image now supports `apt-get install`. ([#1320](https://github.com/simonw/datasette/issues/1320))
- The Heroku runtime used by `datasette publish heroku` is now `python-3.8.10`.",107914493,datasette,"{""url"": ""https://api.github.com/repos/simonw/datasette/releases/44155601/reactions"", ""total_count"": 1, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 1, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}"
https://github.com/simonw/datasette/releases/tag/0.56.1,44155459,MDc6UmVsZWFzZTQ0MTU1NDU5,0.56.1,0.56.x,0.56.1,0,9599,simonw,0,2021-06-05T21:54:47Z,2021-06-05T22:00:01Z,- Fix for a security hole: [reflected cross-site scripting](https://owasp.org/www-community/attacks/xss/#reflected-xss-attacks) in the `?_trace=1` feature. [#1360](https://github.com/simonw/datasette/issues/1360),107914493,datasette,
https://github.com/simonw/sqlite-utils/releases/tag/3.8,44019361,MDc6UmVsZWFzZTQ0MDE5MzYx,3.8,main,3.8,0,9599,simonw,0,2021-06-03T05:16:33Z,2021-06-03T05:17:33Z,"- New `sqlite-utils indexes` command to list indexes in a database, see [Listing indexes](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-indexes). ([#263](https://github.com/simonw/sqlite-utils/issues/263))
- `table.xindexes` introspection property returning more details about that table's indexes, see [.xindexes](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-introspection-xindexes). ([#261](https://github.com/simonw/sqlite-utils/issues/261))",140912432,sqlite-utils,
https://github.com/simonw/sqlite-utils/releases/tag/3.7,43797212,MDc6UmVsZWFzZTQzNzk3MjEy,3.7,main,3.7,0,9599,simonw,0,2021-05-29T05:47:59Z,2021-05-29T05:49:59Z,"- New `table.pks_and_rows_where()` method returning `(primary_key, row_dictionary)` tuples - see [Listing rows with their primary keys](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-pks-and-rows-where). ([#240](https://github.com/simonw/sqlite-utils/issues/240))
- Fixed bug with *table.add_foreign_key()* against columns containing spaces. ([#238](https://github.com/simonw/sqlite-utils/issues/238))
- `table_or_view.drop(ignore=True)` option for avoiding errors if the table or view does not exist. ([#237](https://github.com/simonw/sqlite-utils/issues/237))
- `sqlite-utils drop-view --ignore` and `sqlite-utils drop-table --ignore` options. ([#237](https://github.com/simonw/sqlite-utils/issues/237))
- Fixed a bug with inserts of nested JSON containing non-ascii strings - thanks, Dylan Wu. ([#257](https://github.com/simonw/sqlite-utils/issues/257))
- Suggest `--alter` if an error occurs caused by a missing column. ([#259](https://github.com/simonw/sqlite-utils/issues/259))
- Support creating indexes with columns in descending order, see [API documentation](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-create-index) and [CLI documentation](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-create-index). ([#260](https://github.com/simonw/sqlite-utils/issues/260))
- Correctly handle CSV files that start with a UTF-8 BOM. ([#250](https://github.com/simonw/sqlite-utils/issues/250))",140912432,sqlite-utils,
https://github.com/simonw/datasette/releases/tag/0.57a1,43713686,MDc6UmVsZWFzZTQzNzEzNjg2,0.57a1,main,0.57a1,0,9599,simonw,1,2021-05-27T16:54:21Z,2021-05-27T16:58:41Z,"- Docker image now allows `apt-get install`. [#1320](https://github.com/simonw/datasette/issues/1320)
- `?_col=` and `?_nocol=` options to show and hide columns in a table, plus UI for doing this in the column cog menu. [#615](https://github.com/simonw/datasette/issues/615)
- New `?_facet_size=max` option, linked to from the … on truncated facets. [#1337](https://github.com/simonw/datasette/issues/1337)
- Heroku runtime used by `datasette publish heroku` is now `python-3.8.10`.
- Multi-arch support for built Docker images using Buildx - thanks, [Blair Drummand](https://github.com/blairdrummond). [#1319](https://github.com/simonw/datasette/pull/1319)",107914493,datasette,
https://github.com/simonw/datasette/releases/tag/0.57a0,43419091,MDc6UmVsZWFzZTQzNDE5MDkx,0.57a0,main,0.57a0,0,9599,simonw,1,2021-05-23T00:45:54Z,2021-05-23T00:46:44Z,"Mainly dependency bumps, plus a new `?_facet_size=` argument.
- Updated dependencies: pytest-asyncio, Black, jinja2, aiofiles, itsdangerous
- Fixed bug where columns called ""Link"" were incorrectly displayed in bold. ([#1308](https://github.com/simonw/datasette/issues/1308))
- New `?_facet_size=` argument for customizing the number of facet results returned on a page. ([#1332](https://github.com/simonw/datasette/issues/1332))",107914493,datasette,
https://github.com/simonw/datasette/releases/tag/0.56,40608711,MDc6UmVsZWFzZTQwNjA4NzEx,0.56,main,0.56,0,9599,simonw,0,2021-03-29T00:41:12Z,2021-03-29T00:43:36Z,"Documentation improvements, bug fixes and support for SpatiaLite 5.
- The SQL editor can now be resized by dragging a handle. ([#1236](https://github.com/simonw/datasette/issues/1236))
- Fixed a bug with JSON faceting and the `__arraycontains` filter caused by tables with spaces in their names. ([#1239](https://github.com/simonw/datasette/issues/1239))
- Upgraded `httpx` dependency. ([#1005](https://github.com/simonw/datasette/issues/1005))
- JSON faceting is now suggested even if a column contains blank strings. ([#1246](https://github.com/simonw/datasette/issues/1246))
- New [datasette.add_memory_database()](https://docs.datasette.io/en/stable/internals.html#datasette-add-memory-database) method. ([#1247](https://github.com/simonw/datasette/issues/1247))
- The [Response.asgi_send()](https://docs.datasette.io/en/stable/internals.html#internals-response-asgi-send) method is now documented. ([#1266](https://github.com/simonw/datasette/issues/1266))
- The official Datasette Docker image now bundles SpatiaLite version 5. ([#1278](https://github.com/simonw/datasette/issues/1278))
- Fixed a `no such table: pragma_database_list` bug when running Datasette against SQLite versions prior to SQLite 3.16.0. ([#1276](https://github.com/simonw/datasette/issues/1276))
- HTML lists displayed in table cells are now styled correctly. Thanks, Bob Whitelock. ([#1141](https://github.com/simonw/datasette/issues/1141), [#1252](https://github.com/simonw/datasette/pull/1252))
- Configuration directory mode now correctly serves immutable databases that are listed in `inspect-data.json`. Thanks Campbell Allen and Frankie Robertson. ([#1031](https://github.com/simonw/datasette/pull/1031), [#1229](https://github.com/simonw/datasette/pull/1229))",107914493,datasette,
https://github.com/dogsheep/hacker-news-to-sqlite/releases/tag/0.4,39765751,MDc6UmVsZWFzZTM5NzY1NzUx,0.4,main,0.4,0,9599,simonw,0,2021-03-13T19:11:12Z,2021-03-13T19:15:06Z,"Progress display now shows the total as well as the number currently in the queue.
```
% hacker-news-to-sqlite trees hn.db 26440397
done: 1, in queue: 0, total: 1
done: 2, in queue: 28, total: 30
done: 3, in queue: 27, total: 30
```",248903544,hacker-news-to-sqlite,
https://github.com/simonw/sqlite-utils/releases/tag/3.6,38290990,MDc6UmVsZWFzZTM4MjkwOTkw,3.6,main,3.6,0,9599,simonw,0,2021-02-19T05:18:02Z,2021-02-19T05:19:00Z,"This release adds the ability to execute queries joining data from more than one database file - similar to the cross database querying feature introduced in [Datasette 0.55](https://docs.datasette.io/en/stable/changelog.html#v0-55).
- The `db.attach(alias, filepath)` Python method can be used to attach extra databases to the same connection, see [db.attach() in the Python API documentation](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-attach). ([#113](https://github.com/simonw/sqlite-utils/issues/113))
- The `--attach` option attaches extra aliased databases to run SQL queries against directly on the command-line, see [attaching additional databases in the CLI documentation](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-attach). ([#236](https://github.com/simonw/sqlite-utils/issues/236))",140912432,sqlite-utils,
https://github.com/simonw/datasette/releases/tag/0.55,38264801,MDc6UmVsZWFzZTM4MjY0ODAx,0.55,main,0.55,0,9599,simonw,0,2021-02-19T02:01:06Z,2021-02-19T02:02:29Z,"Support for cross-database SQL queries and built-in support for serving via HTTPS.
- The new `--crossdb` command-line option causes Datasette to attach up to ten database files to the same `/_memory` database connection. This enables cross-database SQL queries, including the ability to use joins and unions to combine data from tables that exist in different database files. See [Cross-database queries](https://docs.datasette.io/en/stable/sql_queries.html#cross-database-queries) for details. ([#283](https://github.com/simonw/datasette/issues/283))
- `--ssl-keyfile` and `--ssl-certfile` options can be used to specify a TLS certificate, allowing Datasette to serve traffic over `https://` without needing to run it behind a separate proxy. ([#1221](https://github.com/simonw/datasette/issues/1221))
- The `/:memory:` page has been renamed (and redirected) to `/_memory` for consistency with the new `/_internal` database introduced in Datasette 0.54. ([#1205](https://github.com/simonw/datasette/issues/1205))
- Added plugin testing documentation on [Using pdb for errors thrown inside Datasette](https://docs.datasette.io/en/stable//testing_plugins.html#testing-plugins-pdb). ([#1207](https://github.com/simonw/datasette/issues/1207))
- The [official Datasette Docker image](https://hub.docker.com/r/datasetteproject/datasette) now uses Python 3.7.10, applying [the latest security fix](https://www.python.org/downloads/release/python-3710/) for that Python version. ([#1235](https://github.com/simonw/datasette/issues/1235))",107914493,datasette,
https://github.com/simonw/sqlite-utils/releases/tag/3.5,38037267,MDc6UmVsZWFzZTM4MDM3MjY3,3.5,main,3.5,0,9599,simonw,0,2021-02-14T22:43:06Z,2021-02-14T22:44:21Z,"- `sqlite-utils insert --sniff` option for detecting the delimiter and quote character used by a CSV file, see [Alternative delimiters and quote characters](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-insert-csv-tsv-delimiter). ([#230](https://github.com/simonw/sqlite-utils/issues/230))
- The `table.rows_where()`, `table.search()` and `table.search_sql()` methods all now take optional `offset=` and `limit=` arguments. ([#231](https://github.com/simonw/sqlite-utils/issues/231))
- New `--no-headers` option for `sqlite-utils insert --csv` to handle CSV files that are missing the header row, see [CSV files without a header row](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-insert-csv-tsv-no-header). ([#228](https://github.com/simonw/sqlite-utils/issues/228))
- Fixed bug where inserting data with extra columns in subsequent chunks would throw an error. Thanks [@nieuwenhoven](https://github.com/nieuwenhoven) for the fix. ([#234](https://github.com/simonw/sqlite-utils/issues/234))
- Fixed bug importing CSV files with columns containing more than 128KB of data. ([#229](https://github.com/simonw/sqlite-utils/issues/229))
- Test suite now runs in CI against Ubuntu, macOS and Windows. Thanks [@nieuwenhoven](https://github.com/nieuwenhoven) for the Windows test fixes. ([#232](https://github.com/simonw/sqlite-utils/issues/232))",140912432,sqlite-utils,
https://github.com/dogsheep/evernote-to-sqlite/releases/tag/0.3.1,37947725,MDc6UmVsZWFzZTM3OTQ3NzI1,0.3.1,main,0.3.1,0,9599,simonw,0,2021-02-11T22:38:21Z,2021-02-11T22:40:40Z,"- Explicitly open file using utf-8 encoding - thanks, RiverZhou. [#10](https://github.com/dogsheep/evernote-to-sqlite/pull/10)
- Fix import error if note has no ""updated"" element - thanks, Matej Korosec. [#8](https://github.com/dogsheep/evernote-to-sqlite/pull/8)
",303218369,evernote-to-sqlite,
https://github.com/dogsheep/evernote-to-sqlite/releases/tag/0.3,37946829,MDc6UmVsZWFzZTM3OTQ2ODI5,0.3,main,0.3,0,9599,simonw,0,2021-02-11T22:14:01Z,2021-02-11T22:16:20Z,"- Correctly handle entities in XHTML notes. [#9](https://github.com/dogsheep/evernote-to-sqlite/issues/9)
- Fixed a bug importing ENEX files on Windows. Thanks, [dskrad](https://github.com/dskrad). [#11](https://github.com/dogsheep/evernote-to-sqlite/issues/11)
",303218369,evernote-to-sqlite,
https://github.com/simonw/sqlite-utils/releases/tag/3.4.1,37438817,MDc6UmVsZWFzZTM3NDM4ODE3,3.4.1,main,3.4.1,0,9599,simonw,0,2021-02-06T02:10:04Z,2021-02-06T02:11:15Z,- Fixed a code import bug that slipped in to 3.4. ([#226](https://github.com/simonw/sqlite-utils/issues/226)),140912432,sqlite-utils,
https://github.com/simonw/sqlite-utils/releases/tag/3.4,37437744,MDc6UmVsZWFzZTM3NDM3NzQ0,3.4,main,3.4,0,9599,simonw,0,2021-02-06T01:37:27Z,2021-02-06T01:38:26Z,- `sqlite-utils insert --csv` now accepts optional `--delimiter` and `--quotechar` options. See [Alternative delimiters and quote characters](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-insert-csv-tsv-delimiter). ([#223](https://github.com/simonw/sqlite-utils/issues/223)),140912432,sqlite-utils,
https://github.com/simonw/datasette/releases/tag/0.54.1,37262719,MDc6UmVsZWFzZTM3MjYyNzE5,0.54.1,0.54.x,0.54.1,0,9599,simonw,0,2021-02-02T21:23:39Z,2021-02-02T21:30:12Z,- Fixed a bug where `?_search=` and `?_sort=` parameters were incorrectly duplicated when the filter form on the table page was re-submitted. ([#1214](https://github.com/simonw/datasette/issues/1214)),107914493,datasette,
https://github.com/simonw/datasette/releases/tag/0.54,36871901,MDc6UmVsZWFzZTM2ODcxOTAx,0.54,main,0.54,0,9599,simonw,0,2021-01-25T17:35:06Z,2021-01-25T17:36:30Z,"The two big new features in this release are the `_internal` SQLite in-memory database storing details of all connected databases and tables, and support for JavaScript modules in plugins and additional scripts.
For additional commentary on this release, see [Datasette 0.54, the annotated release notes](https://simonwillison.net/2021/Jan/25/datasette/).
### The _internal database
As part of ongoing work to help Datasette handle much larger numbers of connected databases and tables (see [Datasette Library](https://github.com/simonw/datasette/issues/417)) Datasette now maintains an in-memory SQLite database with details of all of the attached databases, tables, columns, indexes and foreign keys. ([#1150](https://github.com/simonw/datasette/issues/1150))
This will support future improvements such as a searchable, paginated homepage of all available tables.
You can explore an example of this database by [signing in as root](https://latest.datasette.io/login-as-root) to the `latest.datasette.io` demo instance and then navigating to [latest.datasette.io/_internal](https://latest.datasette.io/_internal).
Plugins can use these tables to introspect attached data in an efficient way. Plugin authors should note that this is not yet considered a stable interface, so any plugins that use this may need to make changes prior to Datasette 1.0 if the `_internal` table schemas change.
### Named in-memory database support
As part of the work building the `_internal` database, Datasette now supports named in-memory databases that can be shared across multiple connections. This allows plugins to create in-memory databases which will persist data for the lifetime of the Datasette server process. ([#1151](https://github.com/simonw/datasette/issues/1151))
The new `memory_name=` parameter to the [Database class](https://docs.datasette.io/en/stable/internals.html#internals-database) can be used to create named, shared in-memory databases.
### JavaScript modules
[JavaScript modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules) were introduced in ECMAScript 2015 and provide native browser support for the `import` and `export` keywords.
To use modules, JavaScript needs to be included in `