[package]
name = "dwctl"
version = "2.2.0"
edition = "2024"
description = "The Doubleword Control Layer - A self-hostable observability and analytics platform for LLM applications"
license = "MIT OR Apache-2.0"
[lib]
name = "dwctl"
path = "src/lib.rs"
[[bin]]
name = "dwctl"
path = "src/main.rs"
[features]
default = ["embedded-db"]
embedded-db = ["dep:postgresql_embedded"]
[dependencies]
axum = { version = "0.8", features = ["multipart"] }
fusillade = { version = "1.0.0" }
tokio = { version = "1.0", features = ["full"] }
tokio-stream = { version = "0.1", features = ["sync"] }
tokio-util = "0.7"
sqlx = { version = "0.8", features = [
"runtime-tokio-rustls",
"postgres",
"uuid",
"chrono",
"migrate",
"rust_decimal",
] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
uuid = { version = "1.0", features = ["v4", "serde"] }
chrono = { version = "0.4", features = ["serde"] }
anyhow = "1.0"
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
opentelemetry = "0.27"
opentelemetry_sdk = { version = "0.27", features = ["rt-tokio"] }
opentelemetry-otlp = { version = "0.27", features = [
"http-proto",
"reqwest-client",
] }
tracing-opentelemetry = "0.28"
tower = "0.5"
tower-http = { version = "0.6", features = ["cors", "fs", "trace"] }
async-trait = "0.1"
url = { version = "2.4", features = ["serde"] }
clap = { version = "4.4", features = ["derive", "env"] }
reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls-webpki-roots-no-provider", "http2", "charset"] }
humantime = "2.2.0"
humantime-serde = "1.1"
utoipa = { version = "5.0", features = [
"axum_extras",
"chrono",
"uuid",
"macros",
] }
utoipa-scalar = { version = "0.3", features = ["axum"] }
figment = { version = "0.10", features = ["yaml", "env", "test"] }
rand = "0.8"
jsonwebtoken = "9.0"
argon2 = "0.5"
base64 = "0.22"
bytes = "1.5"
onwards = "0.11.0"
thiserror = "2.0.14"
axum-prometheus = "0.10"
metrics = "0.24"
metrics-exporter-prometheus = "0.18"
outlet = "0.4.4"
outlet-postgres = "0.4.4"
async-openai = { version = "0.29.2", default-features = false }
brotli = "8.0"
lettre = { version = "0.11", features = [
"smtp-transport",
"file-transport",
"tokio1-rustls-tls",
"builder",
], default-features = false }
aes-gcm = "0.10.3"
paste = "1.0"
serde_with = "3.14.1"
rust_decimal = { version = "1.38.0", features = ["serde"] }
bon = "3.3"
once_cell = "1.20"
prometheus = "0.14"
postgresql_embedded = { version = "0.20", optional = true, features = [
"bundled",
] }
rust-embed = { version = "8.5", features = ["debug-embed"] }
mime_guess = "2.0"
futures = "0.3.31"
dashmap = { version = "6.1.0", features = ["serde"] }
moka = { version = "0.12", features = ["future"] }
async-stripe = { version = "1.0.0-rc.0", default-features = false, features = ["rustls-tls-webpki-roots", "rustls-aws-lc-rs"] }
async-stripe-checkout = { version = "1.0.0-rc.0", features = ["checkout_session"] }
async-stripe-webhook = { version = "1.0.0-rc.0", features = ["async-stripe-checkout", "deserialize"] }
async-stripe-types = { version = "1.0.0-rc.0" }
rustls = { version = "0.23", features = ["aws-lc-rs"] }
async-stripe-billing = { version = "1.0.0-rc.0", features = ["billing_portal_session"] }
[dev-dependencies]
axum-test = { version = "18.4.1" }
sqlx = { version = "0.8", features = [
"postgres",
"runtime-tokio-rustls",
"uuid",
"chrono",
"migrate",
] }
tokio-test = "0.4"
serial_test = "3.0"
test-log = { version = "0.2", features = ["trace"] }
criterion = { version = "0.8", features = ["async_tokio"] }
tempfile = "3.0"
wiremock = "0.6"
serde_urlencoded = "0.7"