Configuration

Datasette offers several ways to configure your Datasette instances: server settings, plugin configuration, authentication, and more.

Most configuration can be handled using a datasette.yaml configuration file, passed to datasette using the -c/--config flag:

datasette mydatabase.db --config datasette.yaml

This file can also use JSON, as datasette.json. YAML is recommended over JSON due to its support for comments and multi-line strings.

Configuration via the command-line

The recommended way to configure Datasette is using a datasette.yaml file passed to -c/--config. You can also pass individual settings to Datasette using the -s/--setting option, which can be used multiple times:

datasette mydatabase.db \
  --setting settings.default_page_size 50 \
  --setting settings.sql_time_limit_ms 3500

This option takes dotted-notation for the first argument and a value for the second argument. This means you can use it to set any configuration value that would be valid in a datasette.yaml file.

It also works for plugin configuration, for example for datasette-cluster-map:

datasette mydatabase.db \
  --setting plugins.datasette-cluster-map.latitude_column xlat \
  --setting plugins.datasette-cluster-map.longitude_column xlon

If the value you provide is a valid JSON object or list it will be treated as nested data, allowing you to configure plugins that accept lists such as datasette-proxy-url:

datasette mydatabase.db \
  -s plugins.datasette-proxy-url.paths '[{"path": "/proxy", "backend": "http://example.com/"}]'

This is equivalent to a datasette.yaml file containing the following:

plugins:
  datasette-proxy-url:
    paths:
    - path: /proxy
      backend: http://example.com/
{
  "plugins": {
    "datasette-proxy-url": {
      "paths": [
        {
          "path": "/proxy",
          "backend": "http://example.com/"
        }
      ]
    }
  }
}

datasette.yaml reference

The following example shows some of the valid configuration options that can exist inside datasette.yaml.

# Datasette settings block
settings:
  default_page_size: 50
  sql_time_limit_ms: 3500
  max_returned_rows: 2000

# top-level plugin configuration
plugins:
  datasette-my-plugin:
    key: valueA

# Database and table-level configuration
databases:
  your_db_name:
    # plugin configuration for the your_db_name database
    plugins:
      datasette-my-plugin:
        key: valueA
    tables:
      your_table_name:
        allow:
          # Only the root user can access this table
          id: root
        # plugin configuration for the your_table_name table
        # inside your_db_name database
        plugins:
          datasette-my-plugin:
            key: valueB
{
  "settings": {
    "default_page_size": 50,
    "sql_time_limit_ms": 3500,
    "max_returned_rows": 2000
  },
  "plugins": {
    "datasette-my-plugin": {
      "key": "valueA"
    }
  },
  "databases": {
    "your_db_name": {
      "plugins": {
        "datasette-my-plugin": {
          "key": "valueA"
        }
      },
      "tables": {
        "your_table_name": {
          "allow": {
            "id": "root"
          },
          "plugins": {
            "datasette-my-plugin": {
              "key": "valueB"
            }
          }
        }
      }
    }
  }
}

Settings

Settings can be configured in datasette.yaml with the settings key:

# inside datasette.yaml
settings:
  default_allow_sql: off
  default_page_size: 50
{
  "settings": {
    "default_allow_sql": "off",
    "default_page_size": 50
  }
}

The full list of settings is available in the settings documentation. Settings can also be passed to Datasette using one or more --setting name value command line options.`

Plugin configuration

Datasette plugins often require configuration. This plugin configuration should be placed in plugins keys inside datasette.yaml.

Most plugins are configured at the top-level of the file, using the plugins key:

# inside datasette.yaml
plugins:
  datasette-my-plugin:
    key: my_value
{
  "plugins": {
    "datasette-my-plugin": {
      "key": "my_value"
    }
  }
}

Some plugins can be configured at the database or table level. These should use a plugins key nested under the appropriate place within the databases object:

# inside datasette.yaml
databases:
  my_database:
    # plugin configuration for the my_database database
    plugins:
      datasette-my-plugin:
        key: my_value
  my_other_database:
    tables:
      my_table:
        # plugin configuration for the my_table table inside the my_other_database database
        plugins:
          datasette-my-plugin:
            key: my_value
{
  "databases": {
    "my_database": {
      "plugins": {
        "datasette-my-plugin": {
          "key": "my_value"
        }
      }
    },
    "my_other_database": {
      "tables": {
        "my_table": {
          "plugins": {
            "datasette-my-plugin": {
              "key": "my_value"
            }
          }
        }
      }
    }
  }
}

Permissions configuration

Datasette's authentication and permissions system can also be configured using datasette.yaml.

Here is a simple example:

# Instance is only available to users 'sharon' and 'percy':
allow:
  id:
  - sharon
  - percy

# Only 'percy' is allowed access to the accounting database:
databases:
  accounting:
    allow:
      id: percy
{
  "allow": {
    "id": [
      "sharon",
      "percy"
    ]
  },
  "databases": {
    "accounting": {
      "allow": {
        "id": "percy"
      }
    }
  }
}

Access permissions in datasette.yaml has the full details.

Canned queries configuration

Canned queries are named SQL queries that appear in the Datasette interface. They can be configured in datasette.yaml using the queries key at the database level:

databases:
  sf-trees:
    queries:
      just_species:
        sql: select qSpecies from Street_Tree_List
{
  "databases": {
    "sf-trees": {
      "queries": {
        "just_species": {
          "sql": "select qSpecies from Street_Tree_List"
        }
      }
    }
  }
}

See the canned queries documentation for more, including how to configure writable canned queries.

Custom CSS and JavaScript

Datasette can load additional CSS and JavaScript files, configured in datasette.yaml like this:

extra_css_urls:
- https://simonwillison.net/static/css/all.bf8cd891642c.css
extra_js_urls:
- https://code.jquery.com/jquery-3.2.1.slim.min.js
{
  "extra_css_urls": [
    "https://simonwillison.net/static/css/all.bf8cd891642c.css"
  ],
  "extra_js_urls": [
    "https://code.jquery.com/jquery-3.2.1.slim.min.js"
  ]
}

The extra CSS and JavaScript files will be linked in the <head> of every page:

<link rel="stylesheet" href="https://simonwillison.net/static/css/all.bf8cd891642c.css">
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>

You can also specify a SRI (subresource integrity hash) for these assets:

extra_css_urls:
- url: https://simonwillison.net/static/css/all.bf8cd891642c.css
  sri: sha384-9qIZekWUyjCyDIf2YK1FRoKiPJq4PHt6tp/ulnuuyRBvazd0hG7pWbE99zvwSznI
extra_js_urls:
- url: https://code.jquery.com/jquery-3.2.1.slim.min.js
  sri: sha256-k2WSCIexGzOj3Euiig+TlR8gA0EmPjuc79OEeY5L45g=
{
  "extra_css_urls": [
    {
      "url": "https://simonwillison.net/static/css/all.bf8cd891642c.css",
      "sri": "sha384-9qIZekWUyjCyDIf2YK1FRoKiPJq4PHt6tp/ulnuuyRBvazd0hG7pWbE99zvwSznI"
    }
  ],
  "extra_js_urls": [
    {
      "url": "https://code.jquery.com/jquery-3.2.1.slim.min.js",
      "sri": "sha256-k2WSCIexGzOj3Euiig+TlR8gA0EmPjuc79OEeY5L45g="
    }
  ]
}

This will produce:

<link rel="stylesheet" href="https://simonwillison.net/static/css/all.bf8cd891642c.css"
    integrity="sha384-9qIZekWUyjCyDIf2YK1FRoKiPJq4PHt6tp/ulnuuyRBvazd0hG7pWbE99zvwSznI"
    crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"
    integrity="sha256-k2WSCIexGzOj3Euiig+TlR8gA0EmPjuc79OEeY5L45g="
    crossorigin="anonymous"></script>

Modern browsers will only execute the stylesheet or JavaScript if the SRI hash matches the content served. You can generate hashes using www.srihash.org

Items in "extra_js_urls" can specify "module": true if they reference JavaScript that uses JavaScript modules. This configuration:

extra_js_urls:
- url: https://example.datasette.io/module.js
  module: true
{
  "extra_js_urls": [
    {
      "url": "https://example.datasette.io/module.js",
      "module": true
    }
  ]
}

Will produce this HTML:

<script type="module" src="https://example.datasette.io/module.js"></script>