diff --git a/.readthedocs.yaml b/.readthedocs.yaml
new file mode 100644
index 00000000..1e096e6a
--- /dev/null
+++ b/.readthedocs.yaml
@@ -0,0 +1,13 @@
+version: 2
+
+build:
+ os: ubuntu-lts-latest
+ tools:
+ python: latest
+
+python:
+ install:
+ - requirements: docs/requirements.txt
+
+sphinx:
+ configuration: docs/conf.py
diff --git a/README.md b/README.md
index 8a786bd6..f2c18e2b 100644
--- a/README.md
+++ b/README.md
@@ -1,20 +1,33 @@
-# Deno based bids-validator
+# The BIDS Validator
-## Intro
+The BIDS Validator is a web application, command-line utility,
+and Javascript/Typescript library for assessing compliance with the
+[Brain Imaging Data Structure][BIDS] standard.
-This is a full rewrite of the bids-validator JavaScript implementation designed to use the [bids-specification schema](https://github.com/bids-standard/bids-specification/tree/master/src/schema) to apply the majority of validation rules.
+## Getting Started
-Deno is a JavaScript and TypeScript runtime that is used to run the schema based validator. Deno is simpler than Node.js and only requires one tool to use, the Deno executable itself. To install Deno, follow these [install instructions for your platform](https://deno.land/manual/getting_started/installation).
+In most cases,
+the simplest way to use the validator is to browse to the [BIDS Validator][] web page:
-## Usage
+![The web interface to the BIDS Validator with the "Select Dataset Files" button highlighted.
+(Dark theme)](_static/web_entrypoint_dark.png){.only-dark width="50%" align=center}
+![The web interface to the BIDS Validator with the "Select Dataset Files" button highlighted.
+(Light theme)](_static/web_entrypoint_light.png){.only-light width="50%" align=center}
-To use the latest validator hosted at https://deno.land/x/bids_validator, use the following command:
+The web validator runs in-browser, and does not transfer data to any remote server.
-```console
-$ deno run --allow-read --allow-env https://deno.land/x/bids_validator/bids-validator.ts path/to/dataset
+In some contexts, such as when working on a remote server,
+it may be easier to use the command-line.
+The BIDS Validator can be run with the [Deno] runtime
+(see [Deno - Installation][] for detailed installation instructions):
+
+```shell
+deno run -ERN jsr:@bids/validator
```
-Deno by default sandboxes applications like a web browser. `--allow-read` allows the validator to read local files, and `--allow-env` enables OS-specific features.
+Deno by default sandboxes applications like a web browser.
+`-E`, `-R` and `-N` allow the validator to read environment variables,
+local files, and network locations.
### Configuration file
@@ -38,13 +51,13 @@ Pass the `--json` flag to see the issues in detail.
### Development tools
-From the repository root, use `bids-validator/bids-validator-deno` to run with all permissions enabled by default:
+From the repository root, use `./local-run` to run with all permissions enabled by default:
```shell
# Run from within the /bids-validator directory
cd bids-validator
# Run validator:
-./bids-validator-deno path/to/dataset
+./local-run path/to/dataset
```
## Schema validator test suite
@@ -56,12 +69,6 @@ deno test --allow-env --allow-read --allow-write src/
This test suite includes running expected output from bids-examples and may throw some expected failures for bids-examples datasets where either the schema or validator are misaligned with the example dataset while under development.
-## Refreshing latest specification
-
-If you are validating with the latest specification instead of a specific version, the validator will hold onto a cached version. You can request the newest version by adding the `--reload` argument to obtain the newest specification definition.
-
-`deno run --reload=https://bids-specification.readthedocs.io/en/latest/schema.json src/main.ts`
-
## Modifying and building a new schema
To modify the schema a clone of bids-standard/bids-specification will need to be made. README and schema itself live here https://github.com/bids-standard/bids-specification/tree/master/src/schema.
diff --git a/deno.json b/deno.json
index bacd96e6..fd80bb15 100644
--- a/deno.json
+++ b/deno.json
@@ -24,19 +24,19 @@
},
"imports": {
"@ajv": "npm:ajv@8.17.1",
- "@bids/schema": "jsr:@bids/schema@0.11.4-dev.8+6e2874ce",
+ "@bids/schema": "jsr:@bids/schema@0.11.4-dev.10+436d7cde",
"@cliffy/command": "jsr:@effigies/cliffy-command@1.0.0-dev.8",
"@cliffy/table": "jsr:@effigies/cliffy-table@1.0.0-dev.5",
"@hed/validator": "npm:hed-validator@3.15.5",
- "@ignore": "npm:ignore@5.3.2",
- "@libs/xml": "jsr:@libs/xml@5.4.13",
+ "@ignore": "npm:ignore@6.0.2",
+ "@libs/xml": "jsr:@libs/xml@6.0.1",
"@mango/nifti": "npm:@bids/nifti-reader-js@0.6.9",
- "@std/assert": "jsr:@std/assert@1.0.2",
- "@std/fmt": "jsr:@std/fmt@1.0.0",
- "@std/fs": "jsr:@std/fs@1.0.1",
- "@std/io": "jsr:@std/io@0.224.4",
- "@std/log": "jsr:@std/log@0.224.5",
- "@std/path": "jsr:@std/path@1.0.2",
+ "@std/assert": "jsr:@std/assert@1.0.7",
+ "@std/fmt": "jsr:@std/fmt@1.0.3",
+ "@std/fs": "jsr:@std/fs@1.0.5",
+ "@std/io": "jsr:@std/io@0.225.0",
+ "@std/log": "jsr:@std/log@0.224.9",
+ "@std/path": "jsr:@std/path@1.0.8",
"@std/yaml": "jsr:@std/yaml@^1.0.4"
},
"tasks": {
diff --git a/deno.lock b/deno.lock
index 582bb600..a9e547f5 100644
--- a/deno.lock
+++ b/deno.lock
@@ -1,78 +1,76 @@
{
"version": "4",
"specifiers": {
- "jsr:@bids/schema@0.11.4-dev.6+d9c23eb0": "0.11.4-dev.6+d9c23eb0",
- "jsr:@cliffy/command@1.0.0-rc.5": "1.0.0-rc.5",
- "jsr:@cliffy/flags@1.0.0-rc.5": "1.0.0-rc.5",
- "jsr:@cliffy/internal@1.0.0-rc.5": "1.0.0-rc.5",
- "jsr:@cliffy/table@1.0.0-rc.5": "1.0.0-rc.5",
- "jsr:@libs/typing@2": "2.9.0",
- "jsr:@libs/xml@5.4.13": "5.4.13",
+ "jsr:@bids/schema@0.11.4-dev.10+436d7cde": "0.11.4-dev.10+436d7cde",
+ "jsr:@cliffy/command@1.0.0-rc.7": "1.0.0-rc.7",
+ "jsr:@cliffy/flags@1.0.0-rc.7": "1.0.0-rc.7",
+ "jsr:@cliffy/internal@1.0.0-rc.7": "1.0.0-rc.7",
+ "jsr:@cliffy/table@1.0.0-rc.7": "1.0.0-rc.7",
+ "jsr:@libs/typing@3": "3.1.0",
+ "jsr:@libs/xml@6.0.1": "6.0.1",
"jsr:@luca/esbuild-deno-loader@0.10.3": "0.10.3",
"jsr:@luca/esbuild-deno-loader@0.11.0": "0.11.0",
- "jsr:@std/assert@1.0.2": "1.0.2",
+ "jsr:@std/assert@1.0.7": "1.0.7",
"jsr:@std/assert@~0.213.1": "0.213.1",
"jsr:@std/bytes@^1.0.2": "1.0.2",
"jsr:@std/bytes@^1.0.2-rc.3": "1.0.2",
- "jsr:@std/cli@1.0.0-rc.2": "1.0.0-rc.2",
"jsr:@std/encoding@0.213": "0.213.1",
"jsr:@std/encoding@^1.0.5": "1.0.5",
- "jsr:@std/fmt@1.0.0": "1.0.0",
- "jsr:@std/fmt@^1.0.0-rc.1": "1.0.0",
- "jsr:@std/fmt@~0.225.4": "0.225.6",
- "jsr:@std/fs@1.0.1": "1.0.1",
- "jsr:@std/fs@^1.0.0-rc.5": "1.0.1",
- "jsr:@std/internal@^1.0.1": "1.0.4",
- "jsr:@std/io@0.224.4": "0.224.4",
- "jsr:@std/io@~0.224.3": "0.224.4",
+ "jsr:@std/fmt@1.0.3": "1.0.3",
+ "jsr:@std/fmt@^1.0.2": "1.0.3",
+ "jsr:@std/fmt@~1.0.2": "1.0.3",
+ "jsr:@std/fs@1.0.5": "1.0.5",
+ "jsr:@std/fs@^1.0.4": "1.0.5",
+ "jsr:@std/internal@^1.0.5": "1.0.5",
+ "jsr:@std/io@0.225": "0.225.0",
+ "jsr:@std/io@0.225.0": "0.225.0",
"jsr:@std/jsonc@0.213": "0.213.1",
- "jsr:@std/log@0.224.5": "0.224.5",
+ "jsr:@std/log@0.224.9": "0.224.9",
"jsr:@std/path@0.213": "0.213.1",
- "jsr:@std/path@1.0.2": "1.0.2",
- "jsr:@std/path@^1.0.2": "1.0.2",
+ "jsr:@std/path@1.0.8": "1.0.8",
"jsr:@std/path@^1.0.6": "1.0.6",
- "jsr:@std/text@1.0.0-rc.1": "1.0.0-rc.1",
+ "jsr:@std/path@^1.0.7": "1.0.8",
+ "jsr:@std/text@~1.0.7": "1.0.8",
"jsr:@std/yaml@^1.0.4": "1.0.5",
+ "npm:@bids/nifti-reader-js@0.6.9": "0.6.9",
"npm:ajv@8.17.1": "8.17.1",
"npm:hed-validator@3.15.5": "3.15.5",
- "npm:ignore@5.3.2": "5.3.2",
- "npm:nifti-reader-js@0.6.8": "0.6.8"
+ "npm:ignore@6.0.2": "6.0.2"
},
"jsr": {
- "@bids/schema@0.11.4-dev.6+d9c23eb0": {
- "integrity": "a0ac8687737bc5e3efa63c00df9c637596441feb2ff5ab243468ca84ea24fc6e"
+ "@bids/schema@0.11.4-dev.10+436d7cde": {
+ "integrity": "ad822d610054450b0b4b2fc71a654a415951e42aa4e753ede4eb550a62d04f50"
},
- "@cliffy/command@1.0.0-rc.5": {
- "integrity": "55e00a1d0ae38152fb275a89494a81ffb9b144eb9060107c0be5af46e1ba736c",
+ "@cliffy/command@1.0.0-rc.7": {
+ "integrity": "1288808d7a3cd18b86c24c2f920e47a6d954b7e23cadc35c8cbd78f8be41f0cd",
"dependencies": [
"jsr:@cliffy/flags",
"jsr:@cliffy/internal",
"jsr:@cliffy/table",
- "jsr:@std/fmt@~0.225.4",
+ "jsr:@std/fmt@~1.0.2",
"jsr:@std/text"
]
},
- "@cliffy/flags@1.0.0-rc.5": {
- "integrity": "bd33b7b399e0af353f5516d87a2d552d46ee7e7f4a6f0c0bc65fcce750710217",
+ "@cliffy/flags@1.0.0-rc.7": {
+ "integrity": "318d9be98f6a6417b108e03dec427dea96cdd41a15beb21d2554ae6da450a781",
"dependencies": [
"jsr:@std/text"
]
},
- "@cliffy/internal@1.0.0-rc.5": {
- "integrity": "1e8dca4fcfba1815bf1a899bb880e09f8b45284c352465ef8fb015887c1fc126"
+ "@cliffy/internal@1.0.0-rc.7": {
+ "integrity": "10412636ab3e67517d448be9eaab1b70c88eba9be22617b5d146257a11cc9b17"
},
- "@cliffy/table@1.0.0-rc.5": {
- "integrity": "2b3e1b4764bbb56b0c39aeba95bc0bb551d9bd4475fbb6d1ce368c08b7ef9eb3",
+ "@cliffy/table@1.0.0-rc.7": {
+ "integrity": "9fdd9776eda28a0b397981c400eeb1aa36da2371b43eefe12e6ff555290e3180",
"dependencies": [
- "jsr:@std/cli",
- "jsr:@std/fmt@~0.225.4"
+ "jsr:@std/fmt@~1.0.2"
]
},
- "@libs/typing@2.9.0": {
- "integrity": "ddf35ea652b807cd9b19b4f3f163fb5d76d57299053753fbd01ba8b02d9306ad"
+ "@libs/typing@3.1.0": {
+ "integrity": "091b59f57a99f84c9fccf8f59534f77f177705ac25183b575c83fd7aa6dcfafe"
},
- "@libs/xml@5.4.13": {
- "integrity": "995320d1ce4a29ced82233e5e46d47a880e338197bbd257a686bf9afcc3ac0e4",
+ "@libs/xml@6.0.1": {
+ "integrity": "64af4f93464c77c3e1158fb97c3657779ca554b14f38616b96cde31e22d8a309",
"dependencies": [
"jsr:@libs/typing"
]
@@ -96,8 +94,8 @@
"@std/assert@0.213.1": {
"integrity": "24c28178b30c8e0782c18e8e94ea72b16282207569cdd10ffb9d1d26f2edebfe"
},
- "@std/assert@1.0.2": {
- "integrity": "ccacec332958126deaceb5c63ff8b4eaf9f5ed0eac9feccf124110435e59e49c",
+ "@std/assert@1.0.7": {
+ "integrity": "64ce9fac879e0b9f3042a89b3c3f8ccfc9c984391af19e2087513a79d73e28c3",
"dependencies": [
"jsr:@std/internal"
]
@@ -105,34 +103,28 @@
"@std/bytes@1.0.2": {
"integrity": "fbdee322bbd8c599a6af186a1603b3355e59a5fb1baa139f8f4c3c9a1b3e3d57"
},
- "@std/cli@1.0.0-rc.2": {
- "integrity": "97dfae82b9f0e189768ebfa7a5da53375955b94bad0a1804f8e3b73563b03787"
- },
"@std/encoding@0.213.1": {
"integrity": "fcbb6928713dde941a18ca5db88ca1544d0755ec8fb20fe61e2dc8144b390c62"
},
"@std/encoding@1.0.5": {
"integrity": "ecf363d4fc25bd85bd915ff6733a7e79b67e0e7806334af15f4645c569fefc04"
},
- "@std/fmt@0.225.6": {
- "integrity": "aba6aea27f66813cecfd9484e074a9e9845782ab0685c030e453a8a70b37afc8"
- },
- "@std/fmt@1.0.0": {
- "integrity": "8a95c9fdbb61559418ccbc0f536080cf43341655e1444f9d375a66886ceaaa3d"
+ "@std/fmt@1.0.3": {
+ "integrity": "97765c16aa32245ff4e2204ecf7d8562496a3cb8592340a80e7e554e0bb9149f"
},
- "@std/fs@1.0.1": {
- "integrity": "d6914ca2c21abe591f733b31dbe6331e446815e513e2451b3b9e472daddfefcb",
+ "@std/fs@1.0.5": {
+ "integrity": "41806ad6823d0b5f275f9849a2640d87e4ef67c51ee1b8fb02426f55e02fd44e",
"dependencies": [
- "jsr:@std/path@^1.0.2"
+ "jsr:@std/path@^1.0.7"
]
},
- "@std/internal@1.0.4": {
- "integrity": "62e8e4911527e5e4f307741a795c0b0a9e6958d0b3790716ae71ce085f755422"
+ "@std/internal@1.0.5": {
+ "integrity": "54a546004f769c1ac9e025abd15a76b6671ddc9687e2313b67376125650dc7ba"
},
- "@std/io@0.224.4": {
- "integrity": "bce1151765e4e70e376039fd72c71672b4d4aae363878a5ee3e58361b81197ec",
+ "@std/io@0.225.0": {
+ "integrity": "c1db7c5e5a231629b32d64b9a53139445b2ca640d828c26bf23e1c55f8c079b3",
"dependencies": [
- "jsr:@std/bytes@^1.0.2-rc.3"
+ "jsr:@std/bytes@^1.0.2"
]
},
"@std/jsonc@0.213.1": {
@@ -141,12 +133,12 @@
"jsr:@std/assert@~0.213.1"
]
},
- "@std/log@0.224.5": {
- "integrity": "4612a45189438441bbd923a4cad1cce5c44c6c4a039195a3e8d831ce38894eee",
+ "@std/log@0.224.9": {
+ "integrity": "419d04e4d93e6b1a0205ac3f94809621cfec3d328d09fec9ec59cafa3b3fcaee",
"dependencies": [
- "jsr:@std/fmt@^1.0.0-rc.1",
- "jsr:@std/fs@^1.0.0-rc.5",
- "jsr:@std/io@~0.224.3"
+ "jsr:@std/fmt@^1.0.2",
+ "jsr:@std/fs@^1.0.4",
+ "jsr:@std/io@0.225"
]
},
"@std/path@0.213.1": {
@@ -155,20 +147,26 @@
"jsr:@std/assert@~0.213.1"
]
},
- "@std/path@1.0.2": {
- "integrity": "a452174603f8c620bd278a380c596437a9eef50c891c64b85812f735245d9ec7"
- },
"@std/path@1.0.6": {
"integrity": "ab2c55f902b380cf28e0eec501b4906e4c1960d13f00e11cfbcd21de15f18fed"
},
- "@std/text@1.0.0-rc.1": {
- "integrity": "34c722203e87ee12792c8d4a0cd2ee0e001341cbce75b860fc21be19d62232b0"
+ "@std/path@1.0.8": {
+ "integrity": "548fa456bb6a04d3c1a1e7477986b6cffbce95102d0bb447c67c4ee70e0364be"
+ },
+ "@std/text@1.0.8": {
+ "integrity": "40ba34caa095f393e78796e5eda37b8b4e2cc6cfd6f51f34658ad7487b1451e4"
},
"@std/yaml@1.0.5": {
"integrity": "71ba3d334305ee2149391931508b2c293a8490f94a337eef3a09cade1a2a2742"
}
},
"npm": {
+ "@bids/nifti-reader-js@0.6.9": {
+ "integrity": "sha512-3KWpGKrgUUvT5Bbl25K9TTQ77DRS5DUpcyhZlAblCPdP1YMy0tCzrxarRTixWM9tDN6sWUOBbf6zQpPyVe11Lw==",
+ "dependencies": [
+ "fflate"
+ ]
+ },
"ajv@8.17.1": {
"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
"dependencies": [
@@ -232,8 +230,8 @@
"ieee754@1.2.1": {
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
},
- "ignore@5.3.2": {
- "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="
+ "ignore@6.0.2": {
+ "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A=="
},
"inherits@2.0.3": {
"integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw=="
@@ -244,12 +242,6 @@
"lodash@4.17.21": {
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
- "nifti-reader-js@0.6.8": {
- "integrity": "sha512-yIKNVzYFiUcSHazoR+sd6Ka7sUmZTabaVqJRFxbdlAKR1hnPBuNP71g3AyApo37nJ3k41c632QPij5q7gF1YPQ==",
- "dependencies": [
- "fflate"
- ]
- },
"node-fetch@2.7.0": {
"integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
"dependencies": [
@@ -409,21 +401,21 @@
},
"workspace": {
"dependencies": [
- "jsr:@bids/schema@0.11.4-dev.6+d9c23eb0",
- "jsr:@cliffy/command@1.0.0-rc.5",
- "jsr:@cliffy/table@1.0.0-rc.5",
- "jsr:@libs/xml@5.4.13",
- "jsr:@std/assert@1.0.2",
- "jsr:@std/fmt@1.0.0",
- "jsr:@std/fs@1.0.1",
- "jsr:@std/io@0.224.4",
- "jsr:@std/log@0.224.5",
- "jsr:@std/path@1.0.2",
+ "jsr:@bids/schema@0.11.4-dev.10+436d7cde",
+ "jsr:@cliffy/command@1.0.0-rc.7",
+ "jsr:@cliffy/table@1.0.0-rc.7",
+ "jsr:@libs/xml@6.0.1",
+ "jsr:@std/assert@1.0.7",
+ "jsr:@std/fmt@1.0.3",
+ "jsr:@std/fs@1.0.5",
+ "jsr:@std/io@0.225.0",
+ "jsr:@std/log@0.224.9",
+ "jsr:@std/path@1.0.8",
"jsr:@std/yaml@^1.0.4",
+ "npm:@bids/nifti-reader-js@0.6.9",
"npm:ajv@8.17.1",
"npm:hed-validator@3.15.5",
- "npm:ignore@5.3.2",
- "npm:nifti-reader-js@0.6.8"
+ "npm:ignore@6.0.2"
]
}
}
diff --git a/docs/.gitignore b/docs/.gitignore
new file mode 100644
index 00000000..69fa449d
--- /dev/null
+++ b/docs/.gitignore
@@ -0,0 +1 @@
+_build/
diff --git a/docs/Makefile b/docs/Makefile
new file mode 100644
index 00000000..d4bb2cbb
--- /dev/null
+++ b/docs/Makefile
@@ -0,0 +1,20 @@
+# Minimal makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line, and also
+# from the environment for the first two.
+SPHINXOPTS ?=
+SPHINXBUILD ?= sphinx-build
+SOURCEDIR = .
+BUILDDIR = _build
+
+# Put it first so that "make" without argument is like "make help".
+help:
+ @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+.PHONY: help Makefile
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+ @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/docs/_static/BIDS_logo_black.svg b/docs/_static/BIDS_logo_black.svg
new file mode 100644
index 00000000..9f1718f7
--- /dev/null
+++ b/docs/_static/BIDS_logo_black.svg
@@ -0,0 +1 @@
+
diff --git a/docs/_static/BIDS_logo_white.svg b/docs/_static/BIDS_logo_white.svg
new file mode 100644
index 00000000..629a5392
--- /dev/null
+++ b/docs/_static/BIDS_logo_white.svg
@@ -0,0 +1 @@
+
diff --git a/docs/_static/web_entrypoint_dark.png b/docs/_static/web_entrypoint_dark.png
new file mode 100644
index 00000000..a6df0e7c
Binary files /dev/null and b/docs/_static/web_entrypoint_dark.png differ
diff --git a/docs/_static/web_entrypoint_light.png b/docs/_static/web_entrypoint_light.png
new file mode 100644
index 00000000..ab1b8dba
Binary files /dev/null and b/docs/_static/web_entrypoint_light.png differ
diff --git a/docs/conf.py b/docs/conf.py
new file mode 100644
index 00000000..710b11c1
--- /dev/null
+++ b/docs/conf.py
@@ -0,0 +1,50 @@
+# Configuration file for the Sphinx documentation builder.
+#
+# For the full list of built-in configuration values, see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+# -- Project information -----------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
+
+project = 'BIDS Validator'
+copyright = '2024, BIDS Contributors'
+author = 'BIDS Contributors'
+
+# -- General configuration ---------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
+
+extensions = [
+ # 'sphinx_js',
+ 'myst_parser',
+ 'sphinx_copybutton',
+ 'sphinx_design',
+]
+
+templates_path = ['_templates']
+exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
+
+
+
+# -- Options for HTML output -------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
+
+html_theme = 'sphinx_book_theme'
+html_static_path = ['_static']
+
+html_theme_options = {
+ "logo": {
+ "text": "The BIDS Validator",
+ "image_light": "_static/BIDS_logo_black.svg",
+ "image_dark": "_static/BIDS_logo_white.svg",
+ }
+}
+
+# -- Customization
+# js_language = 'typescript'
+# js_source_path = '../src/**/*.ts'
+# primary_domain = 'js'
+
+myst_enable_extensions = [
+ "attrs_inline",
+ "colon_fence",
+]
diff --git a/docs/dev/contributing.md b/docs/dev/contributing.md
new file mode 120000
index 00000000..95181235
--- /dev/null
+++ b/docs/dev/contributing.md
@@ -0,0 +1 @@
+../../.github/CONTRIBUTING.md
\ No newline at end of file
diff --git a/docs/dev/environment.md b/docs/dev/environment.md
new file mode 100644
index 00000000..dc310f22
--- /dev/null
+++ b/docs/dev/environment.md
@@ -0,0 +1 @@
+# Development environment
diff --git a/docs/dev/using-the-api.md b/docs/dev/using-the-api.md
new file mode 100644
index 00000000..3017721d
--- /dev/null
+++ b/docs/dev/using-the-api.md
@@ -0,0 +1 @@
+# Using the API
diff --git a/docs/index.md b/docs/index.md
new file mode 100644
index 00000000..6055c5d5
--- /dev/null
+++ b/docs/index.md
@@ -0,0 +1,56 @@
+# The BIDS Validator
+
+The BIDS Validator is a web application, command-line utility,
+and Javascript/Typescript library for assessing compliance with the
+[Brain Imaging Data Structure][BIDS] standard.
+
+## Getting Started
+
+In most cases,
+the simplest way to use the validator is to browse to the [BIDS Validator][] web page:
+
+![The web interface to the BIDS Validator with the "Select Dataset Files" button highlighted.
+(Dark theme)](_static/web_entrypoint_dark.png){.only-dark width="50%" align=center}
+![The web interface to the BIDS Validator with the "Select Dataset Files" button highlighted.
+(Light theme)](_static/web_entrypoint_light.png){.only-light width="50%" align=center}
+
+The web validator runs in-browser, and does not transfer data to any remote server.
+
+In some contexts, such as when working on a remote server,
+it may be easier to use the command-line.
+The BIDS Validator can be run with the [Deno] runtime
+(see [Deno - Installation][] for detailed installation instructions):
+
+```shell
+deno run -A jsr:@bids/validator
+```
+
+```{toctree}
+:hidden:
+:caption: User guide
+
+user_guide/web.md
+user_guide/command-line.md
+user_guide/issues.md
+```
+
+```{toctree}
+:hidden:
+:caption: Developer guide
+
+dev/using-the-api.md
+dev/contributing.md
+dev/environment.md
+```
+
+```{toctree}
+:hidden:
+:caption: Reference
+
+API Reference
+```
+
+[BIDS]: https://bids.neuroimaging.io
+[BIDS Validator]: https://bids-standard.github.io/bids-validator/
+[Deno]: https://deno.com/
+[Deno - Installation]: https://docs.deno.com/runtime/getting_started/installation/
diff --git a/docs/make.bat b/docs/make.bat
new file mode 100644
index 00000000..32bb2452
--- /dev/null
+++ b/docs/make.bat
@@ -0,0 +1,35 @@
+@ECHO OFF
+
+pushd %~dp0
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+ set SPHINXBUILD=sphinx-build
+)
+set SOURCEDIR=.
+set BUILDDIR=_build
+
+%SPHINXBUILD% >NUL 2>NUL
+if errorlevel 9009 (
+ echo.
+ echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+ echo.installed, then set the SPHINXBUILD environment variable to point
+ echo.to the full path of the 'sphinx-build' executable. Alternatively you
+ echo.may add the Sphinx directory to PATH.
+ echo.
+ echo.If you don't have Sphinx installed, grab it from
+ echo.https://www.sphinx-doc.org/
+ exit /b 1
+)
+
+if "%1" == "" goto help
+
+%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+
+:end
+popd
diff --git a/docs/requirements.txt b/docs/requirements.txt
new file mode 100644
index 00000000..d906c34c
--- /dev/null
+++ b/docs/requirements.txt
@@ -0,0 +1,5 @@
+sphinx
+myst_parser
+sphinx-book-theme
+sphinx-copybutton
+sphinx-design
diff --git a/docs/user_guide/command-line.md b/docs/user_guide/command-line.md
new file mode 100644
index 00000000..f57eb049
--- /dev/null
+++ b/docs/user_guide/command-line.md
@@ -0,0 +1,97 @@
+# Using the command line
+
+The BIDS Validator may be run with the [Deno] runtime.
+For detailed installation instructions, see [Deno - Installation][].
+Deno is also available as a [conda-forge package](https://anaconda.org/conda-forge/deno).
+
+## Installation
+
+In general, there is no need to install Deno applications.
+`deno run` allows running from the Javascript Repository:
+
+```sh
+deno run -ERN jsr:@bids/validator
+```
+
+However, you can also install a lightweight script (into `$HOME/.deno/bin`):
+
+```sh
+deno install -ERN -g -n bids-validator jsr:@bids/validator
+```
+
+Or compile a bundled binary:
+
+```sh
+deno compile -ERN -o bids-validator jsr:@bids/validator
+```
+
+## Usage
+
+The BIDS Validator takes a single dataset as input:
+
+::::{tab-set}
+:sync-group: run-method
+
+:::{tab-item} Deno run
+:sync: run
+
+```sh
+deno run -ERN jsr:@bids/validator
+```
+
+:::
+:::{tab-item} Installed
+:sync: install
+
+```sh
+bids-validator
+```
+
+:::
+::::
+
+### Options
+
+| Option | Description |
+| ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `-v`, `--verbose` | Log more extensive information about issues |
+| `-s URL`, `--schema URL` | Specify an alternative [BIDS Schema] for validation |
+| `-c FILE`, `--config FILE` | Provide a [configuration file](#configuration-file) |
+| `-r`, `--recursive` | Validate datasets found in `derivatives/` subdirectories, recursively |
+| `-o FILE`, `--outfile FILE` | Write validation results to file. |
+| `--json` | Output results in machine-readable [JSON] |
+| `--ignoreWarnings` | Do not report warnings |
+| `--ignoreNiftiHeaders` | Do not open NIfTI files, skipping any checks that rely on NIfTI header data |
+| `--filenameMode` | Perform filename checks only on newline-separated filenames read from [stdin] |
+| `--blacklistModalities MOD...` | Raise error if passed modalities are detected in the dataset. Modalities may be any of `mri`, `eeg`, `ieeg`, `meg`, `beh`, `pet`, `micr`, `motion`, `nirs`, or `mrs`. |
+| `--debug LEVEL` | Enable logging at the specified level. Default level is `ERROR`. Levels include (from most to least verbose): `NOTSET`, `DEBUG`, `INFO`, WARN`, `ERROR`, `CRITICAL`. |
+| `--color`, `--no-color` | Enable/disable color. The validator also respects the [NO_COLOR] and [FORCE_COLOR] environment variables. |
+
+## Configuration file
+
+The schema validator accepts a JSON configuration file that reclassifies issues as
+warnings, errors or ignored.
+
+```json
+{
+ "ignore": [
+ { "code": "JSON_KEY_RECOMMENDED", "location": "/T1w.json" }
+ ],
+ "warning": [],
+ "error": [
+ { "code": "NO_AUTHORS" }
+ ]
+}
+```
+
+The issues are partial matches of the [Issues] that the validator accumulates.
+Pass the `--json` flag to see the issues in detail.
+
+[Deno]: https://deno.com/
+[Deno - Installation]: https://docs.deno.com/runtime/getting_started/installation/
+[JSON]: https://www.json.org/json-en.html
+[BIDS Schema]: https://bidsschematools.readthedocs.io
+[stdin]: https://en.wikipedia.org/wiki/Standard_streams
+[NO_COLOR]: https://no-color.org
+[FORCE_COLOR]: https://force-color.org
+[Issues]: https://jsr.io/@bids/validator/doc/issues/~/Issue
diff --git a/docs/user_guide/issues.md b/docs/user_guide/issues.md
new file mode 100644
index 00000000..31189e1f
--- /dev/null
+++ b/docs/user_guide/issues.md
@@ -0,0 +1 @@
+# Understanding issues
diff --git a/docs/user_guide/web.md b/docs/user_guide/web.md
new file mode 100644
index 00000000..617f51e6
--- /dev/null
+++ b/docs/user_guide/web.md
@@ -0,0 +1 @@
+# Using the web validator