-
diff --git a/docs/calypr/data/managing-metadata.md b/docs/calypr/data/managing-metadata.md
new file mode 100644
index 0000000..e6b85b6
--- /dev/null
+++ b/docs/calypr/data/managing-metadata.md
@@ -0,0 +1,182 @@
+# Managing Metadata
+
+Metadata in Calypr is formatted using the Fast Healthcare Interoperability Resources (FHIR) schema. If you choose to bring your own FHIR newline delimited json data, you will need to create a directory called “META” in your git-drs repository in the same directory that you initialized your git-drs repository, and place your metadata files in that directory.
+The META/ folder contains newline-delimited JSON (.ndjson) files representing FHIR resources describing the project, its data, and related entities. Large files are tracked using Git LFS, with a required correlation between each data file and a DocumentReference resource. This project follows a standardized structure to manage large research data files and associated FHIR metadata in a version-controlled, DRS and FHIR compatible format.
+Each file must contain only one type of FHIR resource type, for example META/ResearchStudy.ndjson only contains research study resource typed FHIR objects. The name of the file doesn’t have to match the resource type name, unless you bring your own document references, then you must use DocumentReference.ndjson. For all other FHIR file types this is simply a good organizational practice for organizing your FHIR metadata.
+
+## META/ResearchStudy.ndjson
+
+* The File directory structure root research study is based on the 1st Research Study in the document. This research study is the research study that the autogenerated document references are connected to. Any additional research studies that are provided will be ignored when populating the miller table file tree.
+* Contains at least one FHIR ResearchStudy resource describing the project.
+* Defines project identifiers, title, description, and key attributes.
+
+## META/DocumentReference.ndjson
+
+* Contains one FHIR DocumentReference resource per Git LFS-managed file.
+* Each `DocumentReference.content.attachment.url` field:
+ * Must exactly match the relative path of the corresponding file in the repository.
+ * Example:
+
+```json
+{
+ "resourceType": "DocumentReference",
+ "id": "docref-file1",
+ "status": "current",
+ "content": [
+ {
+ "attachment": {
+ "url": "data/file1.bam",
+ "title": "BAM file for Sample X"
+ }
+ }
+ ]
+}
+```
+
+Place your custom FHIR `.ndjson` files in the `META/` directory:
+
+```bash
+# Copy your prepared FHIR metadata
+cp ~/my-data/patients.ndjson META/
+cp ~/my-data/observations.ndjson META/
+cp ~/my-data/specimens.ndjson META/
+cp ~/my-data/document-references.ndjson META/
+```
+
+## Other FHIR data
+
+\[TODO More intro text here\]
+
+* Patient.ndjson: Participant records.
+* Specimen.ndjson: Biological specimens.
+* ServiceRequest.ndjson: Requested procedures.
+* Observation.ndjson: Measurements or results.
+* Other valid FHIR resource types as required.
+
+Ensure your FHIR `DocumentReference` resources reference the DRS URIs:
+
+Example `DocumentReference` linking to S3 file:
+
+```json
+{
+ "resourceType": "DocumentReference",
+ "id": "doc-001",
+ "status": "current",
+ "content": [{
+ "attachment": {
+ "url": "drs://calypr-public.ohsu.edu/your-drs-id",
+ "title": "sample1.bam",
+ "contentType": "application/octet-stream"
+ }
+ }],
+ "subject": {
+ "reference": "Patient/patient-001"
+ }
+}
+```
+
+
+---
+
+## Validating Metadata
+
+To ensure that the FHIR files you have added to the project are correct and pass schema checking, you can use the [Forge tool](../../tools/forge/index.md).
+
+```bash
+forge validate
+```
+
+Successful output:
+
+✓ Validating META/patients.ndjson... OK
+✓ Validating META/observations.ndjson... OK
+✓ Validating META/specimens.ndjson... OK
+✓ Validating META/document-references.ndjson... OK
+All metadata files are valid.
+
+Fix any validation errors and re-run until all files pass.
+
+
+### Forge Data Quality Assurance Command Line Commands
+
+If you have provided your own FHIR resources there are two commands that might be useful to you for ensuring that your FHIR metadata will appear on the CALYPR data platform as expected. These commands are validate and check-edge
+
+**Validate:**
+```bash
+forge validate META
+# or
+forge validate META/DocumentReference.ndjson
+```
+Validation checks if the provided directory or file will be accepted by the CALYPR data platform. It catches improper JSON formatting and FHIR schema errors.
+
+**Check-edge:**
+```bash
+forge check-edge META
+# or
+forge validate META/DocumentReference.ndjson
+```
+Check-edge ensures that references within your files (e.g., a Patient ID in an Observation) connect to known vertices and aren't "orphaned".
+
+### Validation Process
+
+#### 1\. Schema Validation
+
+* Each .ndjson file in META/ (like ResearchStudy.ndjson, DocumentReference.ndjson, etc.) is read line by line.
+* Every line is parsed as JSON and checked against the corresponding FHIR schema for that resourceType.
+* Syntax errors, missing required fields, or invalid FHIR values trigger clear error messages with line numbers.
+
+#### 2\. Mandatory Files Presence
+
+* Confirms that:
+ * ResearchStudy.ndjson exists and has at least one valid record.
+ * DocumentReference.ndjson exists and contains at least one record.
+* If either is missing or empty, validation fails.
+
+#### 3\. One-to-One Mapping of Files to DocumentReference
+
+* Scans the working directory for Git LFS-managed files in expected locations (e.g., data/).
+* For each file, locates a corresponding DocumentReference resource whose content.attachment.url matches the file’s relative path.
+* Validates:
+ * All LFS files have a matching DocumentReference.
+ * All DocumentReferences point to existing files.
+
+#### 4\. Project-level Referential Checks
+
+* Validates that DocumentReference resources reference the same ResearchStudy via relatesTo or other linking mechanisms.
+* If FHIR resources like Patient, Specimen, ServiceRequest, Observation are present, ensures:
+ * Their id fields are unique.
+ * DocumentReference correctly refers to those resources (e.g., via subject or related fields).
+
+#### 5\. Cross-Entity Consistency
+
+* If multiple optional FHIR .ndjson files exist:
+ * Confirms IDs referenced in one file exist in others.
+ * Detects dangling references (e.g., a DocumentReference.patient ID that's not in Patient.ndjson).
+
+---
+
+#### ✅ Example Error Output
+
+ERROR META/DocumentReference.ndjson line 4: url "data/some\_missing.bam" does not resolve to an existing file
+ERROR META/Specimen.ndjson line 2: id "specimen-123" referenced in Observation.ndjson but not defined
+
+---
+
+#### 🎯 Purpose & Benefits
+
+* Ensures all files and metadata are in sync before submission.
+* Prevents submission failures due to missing pointers or invalid FHIR payloads.
+* Enables CI integration, catching issues early in the development workflow.
+
+---
+
+#### Validation Requirements
+
+Automated tools or CI processes must:
+
+* Verify presence of META/ResearchStudy.ndjson with at least one record.
+* Verify presence of META/DocumentReference.ndjson with one record per LFS-managed file.
+* Confirm every DocumentReference.url matches an existing file path.
+* Check proper .ndjson formatting.
+
+---
\ No newline at end of file
diff --git a/docs/calypr/index.md b/docs/calypr/index.md
new file mode 100644
index 0000000..d0ee9f2
--- /dev/null
+++ b/docs/calypr/index.md
@@ -0,0 +1,43 @@
+# CALYPR Platform
+
+Welcome to the **CALYPR Platform**. CALYPR is a next-generation genomic data science ecosystem designed to bridge the gap between massive, centralized data commons and the agile, distributed workflows of modern researchers.
+
+
+## The CALYPR Philosophy
+
+Traditional data repositories often create data silos where information is easy to store but difficult to move, version, or integrate with external tools. CALYPR breaks these silos by embracing **Interoperability**, **Reproducibility**, and **Scalability**.
+
+### 1. Interoperability (GA4GH Standards)
+CALYPR is built from the ground up on [GA4GH](https://www.ga4gh.org/) standards. By using the **Data Repository Service (DRS)** and **Task Execution Service (TES)**, CALYPR ensures that your data and workflows can move seamlessly between different cloud providers and on-premises high-performance computing (HPC) clusters.
+The data system is based on the Fast Healthcare Interoperability Resources (FHIR) standard.
+
+### 2. Reproducibility (Git-like Data Management)
+The core of the CALYPR experience is **Git-DRS**. We believe that data management should feel as natural as code management. Git-DRS allows you to track, version, and share massive genomic datasets using the familiar `git` commands, ensuring that every analysis is backed by a specific, immutable version of the data.
+
+### 3. Scalability (Hybrid Cloud Infrastructure)
+Whether you are working with a few genomes or petabyte-scale cohorts, CALYPR's architecture—powered by **Gen3**—scales to meet your needs. Our hybrid cloud approach allows for secure data storage in AWS while leveraging your local compute resources when necessary.
+
+---
+
+## How it Works: The Connected Commons
+
+CALYPR acts as the "connective tissue" between your research environment and the cloud:
+
+* **Data Commons ([Gen3](https://gen3.org)):** Provides the robust backend for metadata management, indexing, and authentication.
+* **Version Control ([Git-DRS](../tools/git-drs/index.md)):** Manages the check-in and check-out operations for large files, allowing you to treat remote DRS objects as local files.
+* **Metadata Orchestration ([Forge](../tools/forge/index.md)):** Streamlines the validation, publishing, and harmonizing of genomic metadata.
+* **Compute ([Funnel](../tools/funnel/index.md)):** Executes complex pipelines across distributed environments using standardized task definitions.
+* **Graph Insights ([GRIP](../tools/grip/index.md)):** Enables high-performance queries across heterogeneous datasets once integrated.
+
+---
+
+!!! info "Private Beta"
+ CALYPR platform is currently in a private beta phase. We are actively working with a select group of research partners to refine the platform. If you encounter any issues or have feature requests, please reach out to the team. The individual [tools](../tools/index.md) are available for public use.
+
+---
+
+## Next Steps
+To get started:
+
+1. **[Quick Start Guide](quick-start.md):** The fastest way to install tools and start tracking data.
+2. **[Data & Metadata](data/managing-metadata.md):** Learn how to associate your biological metadata with the files you've uploaded.
\ No newline at end of file
diff --git a/docs/calypr/project-management/.nav.yml b/docs/calypr/project-management/.nav.yml
new file mode 100644
index 0000000..ce24a4e
--- /dev/null
+++ b/docs/calypr/project-management/.nav.yml
@@ -0,0 +1,4 @@
+nav:
+ - Project Customization: custom-views.md
+ - Publishing project: publishing-project.md
+ - Calypr Admin: calypr-admin/
diff --git a/docs/calypr/project-management/calypr-admin/.nav.yml b/docs/calypr/project-management/calypr-admin/.nav.yml
new file mode 100644
index 0000000..bfa1166
--- /dev/null
+++ b/docs/calypr/project-management/calypr-admin/.nav.yml
@@ -0,0 +1,3 @@
+nav:
+ - Add users: add-users.md
+ - Role Based Access Control: approve-requests.md
diff --git a/docs/workflows/add-users.md b/docs/calypr/project-management/calypr-admin/add-users.md
similarity index 72%
rename from docs/workflows/add-users.md
rename to docs/calypr/project-management/calypr-admin/add-users.md
index 86cedac..8589726 100644
--- a/docs/workflows/add-users.md
+++ b/docs/calypr/project-management/calypr-admin/add-users.md
@@ -3,7 +3,7 @@
## Granting user access to a project
Once a project has been created you will have full access to it.
-The project owner can add additional users to the project using the `g3t collaborator` commands.
+The project owner can add additional users to the project using the `data-client collaborator` commands.
There are two ways to request the addition additional users to the project:
@@ -12,15 +12,14 @@ There are two ways to request the addition additional users to the project:
To give another user full access to the project, run the following:
```sh
-g3t collaborator add --write user-can-write@example.com
+data-client collaborator add [project_id] user-can-write@example.com --write
```
Alternatively, to give another user read access only (without the ability to upload to the project), run the following:
```sh
-g3t collaborator add user-read-only@example.com
+data-client collaborator add [project_id] user-read-only@example.com
```
## 2. Approvals
-In order to implement these requests, **an authorized user will need to sign** the request before the user can use the remote repository. See `g3t collaborator approve --help
-`
+In order to implement these requests, **an authorized user will need to sign** the request before the user can use the remote repository. See `data-client collaborator approve --help`
diff --git a/docs/workflows/approve-requests.md b/docs/calypr/project-management/calypr-admin/approve-requests.md
similarity index 90%
rename from docs/workflows/approve-requests.md
rename to docs/calypr/project-management/calypr-admin/approve-requests.md
index 0c836d0..2577139 100644
--- a/docs/workflows/approve-requests.md
+++ b/docs/calypr/project-management/calypr-admin/approve-requests.md
@@ -16,8 +16,8 @@
* Ony users with the steward role can approve and sign a request
```text
-g3t collaborator approve --help
-Usage: g3t collaborator approve [OPTIONS]
+./data-client collaborator approve --help
+Usage: ./data-client collaborator approve [OPTIONS]
Sign an existing request (privileged).
@@ -40,9 +40,9 @@ Note: This example uses the ohsu program, but the same process applies to all pr
```text
## As an admin, I need to grant data steward privileges add the requester reader and updater role on a program to an un-privileged user
-g3t collaborator add add data_steward_example@+ A scalable, hybrid cloud infrastructure designed for the demands of modern genomics research. + Built on open-source standards, CALYPR provides GA4GH-compliant tools for seamless data integration, analysis, and biological insights. Based on the Gen3 Data Commons architecture, CALYPR empowers analysts to manage large-scale genomic datasets and integrate data to build new predictive models. +
+ +Built on Open Standards
+
+ Scalable genomics data science platform for biological insights.
+Next-generation genomics data science platform with scalable cloud / on-prem hybrid infrastructure, streamlining the journey from raw data to discovery.
+ Learn more → +
+ Graph-based data integration for complex research datasets.
+High-performance graph query engine that provides a unified interface across MongoDB, SQL, and key-value stores. Ideal for complex relational discovery in genomics.
+ Learn more → +
+ Distributed task execution for petabyte-scale pipelines.
+Standardized batch computing using the GA4GH TES API. Run Docker-based tasks seamlessly across AWS, Google Cloud, and Kubernetes at any scale.
+ Learn more → +
+ Secure data repository system with version control.
+Manage large-scale genomic data with integrated versioning and metadata management, ensuring reproducibility and data integrity throughout research cycles.
+ Learn more → ++ CALYPR is currently in private beta. If you are interested in early access or a demonstration of the platform, please reach out to us at + support@calypr.org. In the meantime, you can explore our GitHub repository and get access to all of our open source tools. +
+
+
+
+# Additional Resources 📚
+
+- [Helm Repo](https://ohsu-comp-bio.github.io/helm-charts)
+
+- [Helm Repo Source](https://github.com/ohsu-comp-bio/helm-charts)
+
+- [Helm Charts](https://github.com/ohsu-comp-bio/funnel/tree/develop/deployments/kubernetes/helm)
+
+- [The Chart Best Practices Guide](https://helm.sh/docs/chart_best_practices/)
diff --git a/docs/tools/funnel/docs/compute/pbs-torque.md b/docs/tools/funnel/docs/compute/pbs-torque.md
new file mode 100644
index 0000000..59b2dfa
--- /dev/null
+++ b/docs/tools/funnel/docs/compute/pbs-torque.md
@@ -0,0 +1,57 @@
+---
+title: PBS/Torque
+render_macros: true
+menu:
+ main:
+ parent: Compute
+ weight: 20
+---
+# PBS/Torque
+
+Funnel can be configured to submit workers to [PBS/Torque][pbs] by making calls
+to `qsub`.
+
+The Funnel server needs to run on a submission node.
+Configure Funnel to use PBS by including the following config:
+
+It is recommended to update the submit file template so that the
+`funnel worker run` command takes a config file as an argument
+(e.g. `funnel worker run --config /opt/funnel_config.yml --taskID {% raw %}{{.TaskId}}{% endraw %}`)
+
+{% raw %}
+```YAML
+Compute: pbs
+
+PBS:
+ Template: |
+ #!/bin/bash
+ #PBS -N {{.TaskId}}
+ #PBS -o {{.WorkDir}}/funnel-stdout
+ #PBS -e {{.WorkDir}}/funnel-stderr
+ {{if ne .Cpus 0 -}}
+ {{printf "#PBS -l nodes=1:ppn=%d" .Cpus}}
+ {{- end}}
+ {{if ne .RamGb 0.0 -}}
+ {{printf "#PBS -l mem=%.0fgb" .RamGb}}
+ {{- end}}
+ {{if ne .DiskGb 0.0 -}}
+ {{printf "#PBS -l file=%.0fgb" .DiskGb}}
+ {{- end}}
+
+ funnel worker run --taskID {{.TaskId}}
+```
+{% endraw %}
+The following variables are available for use in the template:
+
+| Variable | Description |
+|:------------|:-------------|
+|TaskId | funnel task id |
+|WorkDir | funnel working directory |
+|Cpus | requested cpu cores |
+|RamGb | requested ram |
+|DiskGb | requested free disk space |
+|Zone | requested zone (could be used for queue name) |
+
+See https://golang.org/pkg/text/template for information on creating templates.
+
+[pbs]: https://hpc-wiki.info/hpc/Torque
diff --git a/docs/tools/funnel/docs/compute/slurm.md b/docs/tools/funnel/docs/compute/slurm.md
new file mode 100644
index 0000000..98f1697
--- /dev/null
+++ b/docs/tools/funnel/docs/compute/slurm.md
@@ -0,0 +1,57 @@
+---
+title: Slurm
+menu:
+ main:
+ parent: Compute
+ weight: 20
+---
+# Slurm
+
+Funnel can be configured to submit workers to [Slurm][slurm] by making calls
+to `sbatch`.
+
+The Funnel server needs to run on a submission node.
+Configure Funnel to use Slurm by including the following config:
+
+It is recommended to update the submit file template so that the
+`funnel worker run` command takes a config file as an argument
+(e.g. `funnel worker run --config /opt/funnel_config.yml --taskID {% raw %}{{.TaskId}}{% endraw %}`)
+
+{% raw %}
+```YAML
+Compute: slurm
+
+Slurm:
+ Template: |
+ #!/bin/bash
+ #SBATCH --job-name {{.TaskId}}
+ #SBATCH --ntasks 1
+ #SBATCH --error {{.WorkDir}}/funnel-stderr
+ #SBATCH --output {{.WorkDir}}/funnel-stdout
+ {{if ne .Cpus 0 -}}
+ {{printf "#SBATCH --cpus-per-task %d" .Cpus}}
+ {{- end}}
+ {{if ne .RamGb 0.0 -}}
+ {{printf "#SBATCH --mem %.0fGB" .RamGb}}
+ {{- end}}
+ {{if ne .DiskGb 0.0 -}}
+ {{printf "#SBATCH --tmp %.0fGB" .DiskGb}}
+ {{- end}}
+
+ funnel worker run --taskID {{.TaskId}}
+```
+{% endraw %}
+The following variables are available for use in the template:
+
+| Variable | Description |
+|:------------|:-------------|
+|TaskId | funnel task id |
+|WorkDir | funnel working directory |
+|Cpus | requested cpu cores |
+|RamGb | requested ram |
+|DiskGb | requested free disk space |
+|Zone | requested zone (could be used for queue name) |
+
+See https://golang.org/pkg/text/template for information on creating templates.
+
+[slurm]: https://slurm.schedmd.com/
diff --git a/docs/tools/funnel/docs/databases.md b/docs/tools/funnel/docs/databases.md
new file mode 100644
index 0000000..5eeb638
--- /dev/null
+++ b/docs/tools/funnel/docs/databases.md
@@ -0,0 +1,8 @@
+---
+title: Databases
+menu:
+ main:
+ weight: 5
+---
+
+# Databases
diff --git a/docs/tools/funnel/docs/databases/boltdb.md b/docs/tools/funnel/docs/databases/boltdb.md
new file mode 100644
index 0000000..ea5885e
--- /dev/null
+++ b/docs/tools/funnel/docs/databases/boltdb.md
@@ -0,0 +1,24 @@
+---
+title: Embedded
+menu:
+ main:
+ parent: Databases
+ weight: -10
+---
+
+# Embedded
+
+By default, Funnel uses an embedded database named [BoltDB][bolt] to store task
+and scheduler data. This is great for development and a simple server without
+external dependencies, but it doesn't scale well to larger clusters.
+
+Available config:
+```yaml
+Database: boltdb
+
+BoltDB:
+ # Path to database file
+ Path: ./funnel-work-dir/funnel.db
+```
+
+[bolt]: https://github.com/boltdb/bolt
diff --git a/docs/tools/funnel/docs/databases/datastore.md b/docs/tools/funnel/docs/databases/datastore.md
new file mode 100644
index 0000000..ea31d8c
--- /dev/null
+++ b/docs/tools/funnel/docs/databases/datastore.md
@@ -0,0 +1,94 @@
+---
+title: Datastore
+menu:
+ main:
+ parent: Databases
+---
+
+# Google Cloud Datastore
+
+Funnel supports storing tasks (but not scheduler data) in Google Cloud Datastore.
+
+This implementation currently doesn't work with Appengine, since Appengine places
+special requirements on the context of requests and requires a separate library.
+
+Two entity types are used, "Task" and "TaskPart" (for larger pieces of task content,
+such as stdout/err logs).
+
+Funnel will, by default, try to automatically load credentials from the
+environment. Alternatively, you may explicitly set the credentials in the config.
+You can read more about providing the credentials
+[here](https://cloud.google.com/docs/authentication/application-default-credentials).
+
+Config:
+```yaml
+Database: datastore
+
+Datastore:
+ Project: ""
+ # Path to account credentials file.
+ # Optional. If possible, credentials will be automatically discovered
+ # from the environment.
+ CredentialsFile: ""
+```
+
+Please also import some [composite
+indexes](https://cloud.google.com/datastore/docs/concepts/indexes?hl=en)
+to support the task-list queries.
+This is typically done through command-line by referencing an **index.yaml**
+file (do not change the filename) with the following content:
+
+```shell
+gcloud datastore indexes create path/to/index.yaml --database='funnel'
+```
+
+```yaml
+indexes:
+
+- kind: Task
+ properties:
+ - name: Owner
+ - name: State
+ - name: TagStrings
+ - name: CreationTime
+ direction: desc
+
+- kind: Task
+ properties:
+ - name: Owner
+ - name: State
+ - name: CreationTime
+ direction: desc
+
+- kind: Task
+ properties:
+ - name: Owner
+ - name: TagStrings
+ - name: CreationTime
+ direction: desc
+
+- kind: Task
+ properties:
+ - name: Owner
+ - name: CreationTime
+ direction: desc
+
+- kind: Task
+ properties:
+ - name: State
+ - name: TagStrings
+ - name: CreationTime
+ direction: desc
+
+- kind: Task
+ properties:
+ - name: State
+ - name: CreationTime
+ direction: desc
+
+- kind: Task
+ properties:
+ - name: TagStrings
+ - name: CreationTime
+ direction: desc
+```
\ No newline at end of file
diff --git a/docs/tools/funnel/docs/databases/dynamodb.md b/docs/tools/funnel/docs/databases/dynamodb.md
new file mode 100644
index 0000000..3e536c2
--- /dev/null
+++ b/docs/tools/funnel/docs/databases/dynamodb.md
@@ -0,0 +1,30 @@
+---
+title: DynamoDB
+menu:
+ main:
+ parent: Databases
+---
+
+# DynamoDB
+
+Funnel supports storing task data in DynamoDB. Storing scheduler data is not supported currently, so using the node scheduler with DynamoDB won't work. Using AWS Batch for compute scheduling may be a better option.
+Funnel will, by default, try to automatically load credentials from the environment. Alternatively, you may explicitly set the credentials in the config.
+
+Available Config:
+```yaml
+Database: dynamodb
+
+DynamoDB:
+ # Basename to use for dynamodb tables
+ TableBasename: "funnel"
+ # AWS region
+ Region: "us-west-2"
+ # AWS Access key ID
+ Key: ""
+ # AWS Secret Access Key
+ Secret: ""
+```
+
+### Known issues
+
+Dynamo does not store scheduler data. See [issue 340](https://github.com/ohsu-comp-bio/funnel/issues/340).
diff --git a/docs/tools/funnel/docs/databases/elasticsearch.md b/docs/tools/funnel/docs/databases/elasticsearch.md
new file mode 100644
index 0000000..e397348
--- /dev/null
+++ b/docs/tools/funnel/docs/databases/elasticsearch.md
@@ -0,0 +1,30 @@
+---
+title: Elasticsearch
+menu:
+ main:
+ parent: Databases
+---
+
+# Elasticsearch
+
+Funnel supports storing tasks and scheduler data in Elasticsearch (v8).
+
+Config:
+```yaml
+Database: elastic
+
+Elastic:
+ # Prefix to use for indexes
+ IndexPrefix: "funnel"
+ URL: http://localhost:9200
+ # Optional. Username for HTTP Basic Authentication.
+ Username:
+ # Optional. Password for HTTP Basic Authentication.
+ Password:
+ # Optional. Endpoint for the Elastic Service (https://elastic.co/cloud).
+ CloudID:
+ # Optional. Base64-encoded token for authorization; if set, overrides username/password and service token.
+ APIKey:
+ # Optional. Service token for authorization; if set, overrides username/password.
+ ServiceToken:
+```
diff --git a/docs/tools/funnel/docs/databases/mongodb.md b/docs/tools/funnel/docs/databases/mongodb.md
new file mode 100644
index 0000000..4a6e8ab
--- /dev/null
+++ b/docs/tools/funnel/docs/databases/mongodb.md
@@ -0,0 +1,24 @@
+---
+title: MongoDB
+menu:
+ main:
+ parent: Databases
+---
+
+# MongoDB
+
+Funnel supports storing tasks and scheduler data in MongoDB.
+
+Config:
+```yaml
+Database: mongodb
+
+MongoDB:
+ # Addresses for the seed servers.
+ Addrs:
+ - "localhost"
+ # Database name used within MongoDB to store funnel data.
+ Database: "funnel"
+ Username: ""
+ Password: ""
+```
diff --git a/docs/tools/funnel/docs/development.md b/docs/tools/funnel/docs/development.md
new file mode 100644
index 0000000..1412f0d
--- /dev/null
+++ b/docs/tools/funnel/docs/development.md
@@ -0,0 +1,8 @@
+---
+title: Development
+menu:
+ main:
+ weight: 30
+---
+
+# Development
diff --git a/docs/tools/funnel/docs/development/developers.md b/docs/tools/funnel/docs/development/developers.md
new file mode 100644
index 0000000..2d19f0a
--- /dev/null
+++ b/docs/tools/funnel/docs/development/developers.md
@@ -0,0 +1,97 @@
+---
+title: Funnel Developers
+
+menu:
+ main:
+ parent: Development
+ weight: 30
+---
+
+# Developers
+
+This page contains a rough collection of notes for people wanting to build Funnel from source and/or edit the code.
+
+### Building the Funnel source
+
+1. Install [Go 1.21+][go]. Check the version with `go version`.
+2. Ensure GOPATH is set. See [the docs][gopath] for help. Also, you probably want to add `$GOPATH/bin` to your `PATH`.
+3. Clone funnel and build
+
+ ```shell
+ $ git clone https://github.com/ohsu-comp-bio/funnel.git
+ $ cd funnel
+ $ make
+ ```
+
+4. Funnel is now downloaded and installed. Try `funnel version`.
+5. You can edit the code and run `make install` to recompile.
+
+### Developer Tools
+
+A Funnel development environment includes:
+
+- [Go 1.21+][go] for the majority of the code.
+- [Task Execution Schemas][tes] for task APIs.
+- [Protobuf][protobuf] + [gRPC][grpc] for RPC communication.
+- [gRPC Gateway][gateway] for HTTP communication.
+- [Angular][angular] and [SASS][sass] for the web dashboard.
+- [GNU Make][make] for development tasks.
+- [Docker][docker] for executing task containers (tested with v1.12, v1.13).
+- [dep][dep] for Go dependency vendoring.
+- [Make][make] for development/build commands.
+- [NodeJS][node] and [NPM][npm] for web dashboard development.
+
+### Makefile
+
+Most development tasks are run through `make` commands, including build, release, testing, website docs, lint, tidy, webdash dev, and more. See the [Makefile](https://github.com/ohsu-comp-bio/funnel/blob/master/Makefile) for an up-to-date list of commands.
+
+### Go Tests
+
+Run all tests: `make test`
+Run the worker tests: `go test ./worker/...`
+Run the worker tests with "Cancel" in the name: `go test ./worker -run Cancel`
+
+You get the idea. See the `go test` docs for more.
+
+### Mocking
+
+The [testify][testify] and [mockery][mockery] tools are used to generate and use
+mock interfaces in test code, for example, to mock the Google Cloud APIs.
+
+[go]: https://golang.org
+[angular]: https://angularjs.org/
+[protobuf]: https://github.com/google/protobuf
+[grpc]: http://www.grpc.io/
+[sass]: http://sass-lang.com/
+[make]: https://www.gnu.org/software/make/
+[docker]: https://docker.io
+[python]: https://www.python.org/
+[dep]: https://golang.github.io/dep/
+[node]: https://nodejs.org
+[npm]: https://www.npmjs.com/
+[gateway]: https://github.com/grpc-ecosystem/grpc-gateway
+[tes]: https://github.com/ga4gh/task-execution-schemas
+[testify]: https://github.com/stretchr/testify
+[mockery]: https://github.com/vektra/mockery
+[gopath]: https://golang.org/doc/code.html#GOPATH
+
+### Making a release
+
+- Update Makefile, edit `FUNNEL_VERSION` and `LAST_PR_NUMBER`
+ - `LAST_PR_NUMBER` can be found by looking at the previous release notes
+ from the previous release.
+- Run `make website`, which updates the download links and other content.
+ - Check the website locally by running `make website-dev`
+- Commit these changes.
+ - Because goreleaser requires a clean working tree in git
+ - This is a special case where it's easiest to commit to master.
+- Create a git tag: `git tag X.Y.Z`
+- Run `make release`
+ - This will build cross-platform binaries, build release notes,
+ and draft an unpublished GitHub release.
+ - Check the built artifacts by downloading the tarballs from the GitHub draft release
+ and running `funnel version`.
+- `git push origin master` to push your website and release changes.
+- A tagged docker image for the release will be built automatically on [dockerhub](https://hub.docker.com/repository/docker/quay.io/ohsu-comp-bio/funnel).
+- Publish the draft release on GitHub.
+- Copy `build/release/funnel.rb` to the `ohsu-comp-bio/homebrew-formula/Formula/funnel.rb` Homebrew formula repo, and push those changes to master.
diff --git a/docs/tools/funnel/docs/events.md b/docs/tools/funnel/docs/events.md
new file mode 100644
index 0000000..87941ef
--- /dev/null
+++ b/docs/tools/funnel/docs/events.md
@@ -0,0 +1,7 @@
+---
+title: Events
+menu:
+ main:
+ weight: 5
+---
+# Events
diff --git a/docs/tools/funnel/docs/events/kafka.md b/docs/tools/funnel/docs/events/kafka.md
new file mode 100644
index 0000000..242ce93
--- /dev/null
+++ b/docs/tools/funnel/docs/events/kafka.md
@@ -0,0 +1,22 @@
+---
+title: Kafka
+menu:
+ main:
+ parent: Events
+---
+
+# Kafka
+
+Funnel supports writing task events to a Kafka topic. To use this, add an event
+writer to the config:
+
+```yaml
+EventWriters:
+ - kafka
+ - log
+
+Kafka:
+ Servers:
+ - localhost:9092
+ Topic: funnel-events
+```
diff --git a/docs/tools/funnel/docs/integrations/nextflow.md b/docs/tools/funnel/docs/integrations/nextflow.md
new file mode 100644
index 0000000..3090a94
--- /dev/null
+++ b/docs/tools/funnel/docs/integrations/nextflow.md
@@ -0,0 +1,100 @@
+---
+title: Nextflow
+menu:
+ main:
+ parent: Integrations
+---
+
+> ⚠️ Nextflow support is currently in development and requires a few additional steps to run which are included below.
+
+# Nextflow
+
+[Nextflow](https://nextflow.io/) is a workflow engine with a [rich ecosystem]() of pipelines centered around biological analysis.
+
+> Nextflow enables scalable and reproducible scientific workflows using software containers. It allows the adaptation of pipelines written in the most common scripting languages.
+
+> Its fluent DSL simplifies the implementation and the deployment of complex parallel and reactive workflows on clouds and clusters.
+
+Since Nextflow [includes support](https://www.nextflow.io/docs/latest/executor.html#ga4gh-tes) for the TES API, it can be used in conjunction with Funnel to run tasks or to interact with a common TES endpoint.
+
+## Getting Started
+
+To set up Nextflow to use Funnel as the TES executor, run the following steps:
+
+### 1. Install Nextflow
+
+*Adapted from the [Nextflow Documentation](https://nextflow.io/docs/latest/install.html)*
+
+#### a. Install Nextflow:
+
+```sh
+curl -s https://get.nextflow.io | bash
+```
+
+This will create the nextflow executable in the current directory.
+
+#### b. Make Nextflow executable:
+
+```sh
+chmod +x nextflow
+```
+
+#### c. Move Nextflow into an executable path:
+
+```sh
+sudo mv nextflow /usr/local/bin
+```
+
+#### d. Confirm that Nextflow is installed correctly:
+
+```sh
+nextflow info
+```
+
+### 2. Update Nextflow Config
+
+Add the following to your `nextflow.config` in order to use the GA4GH TES plugin:
+
+```yaml
+cat <