[workspace] resolver = "2" members = [ "crates/mt-core", "crates/mt-db", ] default-members = ["."] [workspace.package] version = "0.5.1" edition = "2024" license = "LicenseRef-PolyForm-Noncommercial-1.0.0" [workspace.dependencies] # Core tokio = { version = "1", features = ["rt-multi-thread", "sync", "time", "macros", "signal"] } tokio-util = { version = "0.7", features = ["io"] } thiserror = "2" serde = { version = "1", features = ["derive"] } serde_json = "1" tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter"] } # Web axum = { version = "0.8", features = ["ws", "multipart"] } tower = "0.5" tower-http = { version = "0.7", features = ["fs", "cors", "trace", "set-header", "timeout"] } tower-sessions = "0.14" tower-sessions-sqlx-store = { version = "0.15", features = ["postgres"] } # HTTP client / crypto # `rustls-no-provider` rather than `rustls`: the latter is an alias for # `__rustls-aws-lc-rs`, which links a C crypto backend. The provider is ring # (pure Rust), installed process-wide by `crate::tls` before any client is built. # `form` is what the OAuth token exchange is sent as (RFC 6749 ยง4.1.3, and what # the MNW server's `axum::Form` extractor accepts); `json` is for reading the # responses back. reqwest = { version = "0.13", default-features = false, features = ["form", "json", "rustls-no-provider"] } rustls = { version = "0.23", default-features = false, features = ["std", "tls12", "logging", "ring"] } # Reads the host trust store, which is what reqwest's platform verifier does on # Linux and what the AWS client behind s3-storage calls directly. Already in the # tree through both of those; declared here so trust_store can probe the same # store the outbound paths will use (deploy/README.md). rustls-native-certs = "0.8" # Pinned to the exact major reqwest resolves so the SSRF pre-check parses the # host with the same parser reqwest connects through (link_preview::validate_url). url = "2" sha2 = "0.11" hmac = "0.13" base64 = "0.22" rand = "0.10" # Live chat livechat = { path = "../shared/livechat", features = ["axum"] } async-trait = "0.1" dashmap = "6" # S3 storage s3-storage = { path = "../shared/s3-storage" } # Database sqlx = { version = "0.8", features = ["runtime-tokio", "postgres", "chrono", "uuid"] } # Rate limiting tower_governor = "0.8" governor = "0.10" # Utilities chrono = { version = "0.4", features = ["serde"] } uuid = { version = "1", features = ["v4", "serde"] } pulldown-cmark = "0.13" askama = "0.16.0" # Internal crates mt-core = { path = "crates/mt-core" } mt-db = { path = "crates/mt-db" } tagtree = { path = "../shared/tagtree" } [package] name = "multithreaded" license.workspace = true version.workspace = true edition.workspace = true [dependencies] mt-core = { workspace = true } mt-db = { workspace = true } tokio = { workspace = true } tokio-util = { workspace = true } axum = { workspace = true } tower = { workspace = true } tower-http = { workspace = true } tracing = { workspace = true } tracing-subscriber = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } askama = { workspace = true } chrono = { workspace = true } uuid = { workspace = true } sqlx = { workspace = true } tower-sessions = { workspace = true } tower-sessions-sqlx-store = { workspace = true } reqwest = { workspace = true } rustls = { workspace = true } rustls-native-certs = { workspace = true } url = { workspace = true } sha2 = { workspace = true } base64 = { workspace = true } rand = { workspace = true } pulldown-cmark = { workspace = true } docengine = { git = "https://makenot.work/git/max/docengine.git", version = "0.7", features = ["mentions", "quotes"] } tagtree = { workspace = true } tower_governor = { workspace = true } governor = { workspace = true } s3-storage = { workspace = true } livechat = { workspace = true } async-trait = { workspace = true } dashmap = { workspace = true } dotenvy = "0.15" hex = "0.4" hmac = { workspace = true } regex-lite = "0.1" urlencoding = "2" time = "0.3" include_dir = "0.7.4" [dev-dependencies] http-body-util = "0.1" wiremock = "0.6" pom-contract = { path = "../shared/pom-contract" } # Enable mt-db's setup-only mutations for the integration suite. Resolver 2 keeps # this feature out of the normal/production build. mt-db = { workspace = true, features = ["test-support"] } [workspace.lints.rust] unused = "warn" unreachable_pub = "warn" [workspace.lints.clippy] pedantic = { level = "warn", priority = -1 } # Allow-list tuned from a measured breakdown across server/multithreaded/pter # (2026-07-22). These are the high-churn / low-signal pedantic lints; everything # else in `pedantic` stays a warning. Keep this block identical across repos. module_name_repetitions = "allow" # Doc lints. No docs-completeness push is underway. missing_errors_doc = "allow" missing_panics_doc = "allow" doc_markdown = "allow" # Numeric casts. Endemic and mostly intentional in size and byte math. cast_possible_truncation = "allow" cast_sign_loss = "allow" cast_precision_loss = "allow" cast_possible_wrap = "allow" cast_lossless = "allow" # Subjective structure and style nags. High churn, low signal. must_use_candidate = "allow" too_many_lines = "allow" struct_excessive_bools = "allow" similar_names = "allow" items_after_statements = "allow" single_match_else = "allow" # Frequent false-positives in TUI and router-heavy code. match_same_arms = "allow" unnecessary_wraps = "allow" type_complexity = "allow" [lints] workspace = true