diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 7298c55ff..788c9d851 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -28,10 +28,6 @@ updates:
directory: "/stac-server"
schedule:
interval: "weekly"
- - package-ecosystem: "cargo"
- directory: "/stac-validate"
- schedule:
- interval: "weekly"
- package-ecosystem: "pip"
directory: "/scripts"
schedule:
diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml
deleted file mode 100644
index e65f6bae5..000000000
--- a/.github/workflows/validate.yml
+++ /dev/null
@@ -1,40 +0,0 @@
-name: Validate
-
-on:
- pull_request:
- paths:
- - validate/**
- push:
- branches:
- - main
- paths:
- - validate/**
- workflow_dispatch:
-
-defaults:
- run:
- working-directory: validate
-
-concurrency:
- group: ${{ github.workflow }}-${{ github.ref }}
- cancel-in-progress: true
-
-env:
- CARGO_TERM_COLOR: always
- CARGO_TERM_VERBOSE: true
-
-jobs:
- test-validate:
- strategy:
- matrix:
- os:
- - ubuntu-latest
- - macos-latest
- - windows-latest
- runs-on: ${{ matrix.os }}
- steps:
- - uses: actions/checkout@v4
- - name: Set up Rust cache
- uses: Swatinem/rust-cache@v2
- - name: Test
- run: cargo test
diff --git a/Cargo.toml b/Cargo.toml
index 2a9da38f3..5fe1ee759 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,13 +1,4 @@
[workspace]
resolver = "2"
-members = [
- "api",
- "cli",
- "core",
- "duckdb",
- "pgstac",
- "python",
- "server",
- "validate",
-]
-default-members = ["api", "cli", "core", "server", "validate"]
+members = ["api", "cli", "core", "duckdb", "pgstac", "python", "server"]
+default-members = ["api", "cli", "core", "server"]
diff --git a/README.md b/README.md
index fee685a8e..bb0dfa823 100644
--- a/README.md
+++ b/README.md
@@ -24,7 +24,6 @@ This monorepo contains several crates:
| [stac-api](./api/README.md) | Data structures for the [STAC API](https://github.com/radiantearth/stac-api-spec) specification | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/stac-utils/stac-rs/api.yml?style=flat-square&branch=main)](https://github.com/stac-utils/stac-rs/actions/workflows/api.yml)
[![docs.rs](https://img.shields.io/docsrs/stac-api?style=flat-square)](https://docs.rs/stac-api/latest/stac_api/)
[![Crates.io](https://img.shields.io/crates/v/stac-api?style=flat-square)](https://crates.io/crates/stac-api) |
| [stac-cli](./cli/README.md)| Command line interface | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/stac-utils/stac-rs/cli.yml?style=flat-square&branch=main)](https://github.com/stac-utils/stac-rs/actions/workflows/cli.yml)
[![docs.rs](https://img.shields.io/docsrs/stac-cli?style=flat-square)](https://docs.rs/stac-cli/latest/stac_cli/)
[![Crates.io](https://img.shields.io/crates/v/stac-cli?style=flat-square)](https://crates.io/crates/stac-cli) |
| [stac-server](./server/README.md)| STAC API server with multiple backends | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/stac-utils/stac-rs/server.yml?style=flat-square&branch=main)](https://github.com/stac-utils/stac-rs/actions/workflows/server.yml)
[![docs.rs](https://img.shields.io/docsrs/stac-server?style=flat-square)](https://docs.rs/stac-server/latest/stac_server/)
[![Crates.io](https://img.shields.io/crates/v/stac-server?style=flat-square)](https://crates.io/crates/stac-server) |
-| [stac-validate](./validate/README.md) | Validate STAC data structures with [jsonschema](https://json-schema.org/) | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/stac-utils/stac-rs/validate.yml?style=flat-square&branch-main)](https://github.com/stac-utils/stac-rs/actions/workflows/validate.yml)
[![docs.rs](https://img.shields.io/docsrs/stac-validate?style=flat-square)](https://docs.rs/stac-validate/latest/stac-validate/)
[![Crates.io](https://img.shields.io/crates/v/stac-validate?style=flat-square)](https://crates.io/crates/stac-validate) |
| [pgstac](./pgstac/README.md) | Bindings for [pgstac](https://github.com/stac-utils/pgstac) | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/stac-utils/stac-rs/pgstac.yml?style=flat-square&branch=main)](https://github.com/stac-utils/stac-rs/actions/workflows/pgstac.yml)
[![docs.rs](https://img.shields.io/docsrs/pgstac?style=flat-square)](https://docs.rs/pgstac/latest/pgstac/)
[![Crates.io](https://img.shields.io/crates/v/pgstac?style=flat-square)](https://crates.io/crates/pgstac) |
| [stac-duckdb](./duckdb/README.md) | Experimental client for [duckdb](https://duckdb.org/) | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/stac-utils/stac-rs/duckdb.yml?style=flat-square&branch=main)](https://github.com/stac-utils/stac-rs/actions/workflows/duckdb.yml)
[![docs.rs](https://img.shields.io/docsrs/stac-duckdb?style=flat-square)](https://docs.rs/stac-duckdb/latest/stac_duckdb/)
[![Crates.io](https://img.shields.io/crates/v/stac-duckdb?style=flat-square)](https://crates.io/crates/stac-duckdb) |
diff --git a/cli/Cargo.toml b/cli/Cargo.toml
index bdfce5cd7..e0b29b982 100644
--- a/cli/Cargo.toml
+++ b/cli/Cargo.toml
@@ -32,11 +32,11 @@ stac = { version = "0.10.0", path = "../core", features = [
"geoparquet-compression",
"object-store-all",
"reqwest",
+ "validate",
] }
stac-api = { version = "0.6.0", path = "../api", features = ["client"] }
stac-duckdb = { version = "0.0.2", path = "../duckdb", optional = true }
stac-server = { version = "0.3.1", path = "../server", features = ["axum"] }
-stac-validate = { version = "0.3.0", path = "../validate" }
thiserror = "1"
tokio = { version = "1.23", features = [
"macros",
diff --git a/cli/src/args/validate.rs b/cli/src/args/validate.rs
index 17699c90a..29c339519 100644
--- a/cli/src/args/validate.rs
+++ b/cli/src/args/validate.rs
@@ -1,6 +1,6 @@
use super::{Input, Run};
use crate::{Error, Result, Value};
-use stac_validate::Validate;
+use stac::Validate;
use tokio::sync::mpsc::Sender;
/// Arguments for the `validate` subcommand.
@@ -17,7 +17,7 @@ impl Run for Args {
async fn run(self, input: Input, _: Option>) -> Result