[workspace] resolver = "2" members = [ "apps/app", "apps/app-playground", "apps/daedalus_client", "apps/labrinth", "packages/app-lib", "packages/ariadne", "packages/daedalus", "packages/modrinth-log", "packages/modrinth-maxmind", "packages/modrinth-util", "packages/path-util", ] [workspace.package] edition = "2024" rust-version = "1.90.0" repository = "https://github.com/modrinth/code" [workspace.dependencies] actix-cors = "0.7.1" actix-files = "0.6.8" actix-http = "3.11.2" actix-multipart = "0.7.2" actix-rt = "2.11.0" actix-web = "4.11.0" actix-web-prom = "0.10.0" actix-ws = "0.3.0" arc-swap = "1.7.1" argon2 = { version = "0.5.3", features = ["std"] } ariadne = { path = "packages/ariadne" } async-compression = { version = "0.4.32", default-features = false } async-recursion = "1.1.1" async-stripe = { version = "0.41.0", default-features = false, features = [ "runtime-tokio-hyper-rustls", ] } async-trait = "0.1.89" async-tungstenite = { version = "0.31.0", default-features = false, features = [ "futures-03-sink" ] } async-walkdir = "2.1.0" async_zip = "0.0.18" base64 = "0.22.1" bitflags = "2.9.4" bytemuck = "1.24.0" bytes = "1.10.1" censor = "0.3.0" chardetng = "0.1.17" chrono = "0.4.42" cidre = { version = "0.11.3", default-features = false, features = [ "macos_15_0" ] } clap = "4.5.48" clickhouse = "0.14.0" color-eyre = "0.6.5" color-thief = "0.2.2" const_format = "0.2.34" daedalus = { path = "packages/daedalus" } dashmap = "6.1.0" data-url = "0.3.2" deadpool-redis = "0.22.0" derive_more = "2.0.1" directories = "6.0.0" dirs = "6.0.0" discord-rich-presence = "1.0.0" dotenv-build = "0.1.1" dotenvy = "0.15.7" dunce = "1.0.5" either = "1.15.0" encoding_rs = "0.8.35" enumset = "1.1.10" eyre = "0.6.12" flate2 = "1.1.4" fs4 = { version = "0.13.1", default-features = false } futures = "0.3.31" futures-util = "0.3.31" heck = "0.5.0" hex = "0.4.3" hickory-resolver = "0.25.2" hmac = "0.12.1" hyper = "1.7.0" hyper-rustls = { version = "0.27.7", default-features = false, features = [ "aws-lc-rs", "http1", "native-tokio", "tls12", ] } hyper-util = "0.1.17" iana-time-zone = "0.1.64" image = { version = "0.25.8", default-features = false, features = ["rayon"] } indexmap = "2.11.4" indicatif = "0.18.0" itertools = "0.14.0" jemalloc_pprof = "0.8.1" json-patch = { version = "4.1.0", default-features = false } lettre = { version = "0.11.19", default-features = false, features = [ "aws-lc-rs", "builder", "hostname", "pool", "rustls", "rustls-native-certs", "smtp-transport", "tokio1", "tokio1-rustls", ] } maxminddb = "0.26.0" meilisearch-sdk = { version = "0.30.0", default-features = false } modrinth-log = { path = "packages/modrinth-log" } modrinth-maxmind = { path = "packages/modrinth-maxmind" } modrinth-util = { path = "packages/modrinth-util" } muralpay = { path = "packages/muralpay" } murmur2 = "0.1.0" native-dialog = "0.9.2" notify = { version = "8.2.0", default-features = false } notify-debouncer-mini = { version = "0.7.0", default-features = false } p256 = "0.13.2" paste = "1.0.15" path-util = { path = "packages/path-util" } phf = { version = "0.13.1", features = ["macros"] } png = "0.18.0" prometheus = "0.14.0" quartz_nbt = "0.2.9" quick-xml = "0.38.3" rand = "=0.8.5" # Locked on 0.8 until argon2 and p256 update to 0.9 rand_chacha = "=0.3.1" # Locked on 0.3 until we can update rand to 0.9 redis = "0.32.7" regex = "1.12.2" reqwest = { version = "0.12.24", default-features = false } rgb = "0.8.52" rust_decimal = { version = "1.39.0", features = [ "serde-with-float", "serde-with-str" ] } rust_iso3166 = "0.1.14" rust-s3 = { version = "0.37.0", default-features = false, features = [ "fail-on-err", "tags", "tokio-rustls-tls", ] } rustls = "0.23.32" rusty-money = "0.4.1" secrecy = "0.10.3" sentry = { version = "0.45.0", default-features = false, features = [ "backtrace", "contexts", "debug-images", "panic", "reqwest", "rustls", ] } sentry-actix = "0.45.0" serde = "1.0.228" serde_bytes = "0.11.19" serde_cbor = "0.11.2" serde_ini = "0.2.0" serde_json = "1.0.145" serde_with = "3.15.0" serde-xml-rs = "0.8.1" # Also an XML (de)serializer, consider dropping yaserde in favor of this sha1 = "0.10.6" sha1_smol = { version = "1.0.1", features = ["std"] } sha2 = "0.10.9" shlex = "1.3.0" spdx = "0.12.0" sqlx = { version = "0.8.6", default-features = false } strum = "0.27.2" sysinfo = { version = "0.37.2", default-features = false } tar = "0.4.44" tauri = "2.8.5" tauri-build = "2.4.1" tauri-plugin-deep-link = "2.4.3" tauri-plugin-dialog = "2.4.0" tauri-plugin-http = "2.5.2" tauri-plugin-opener = "2.5.0" tauri-plugin-os = "2.3.1" tauri-plugin-single-instance = "2.3.4" tauri-plugin-updater = { version = "2.9.0", default-features = false, features = [ "rustls-tls", "zip", ] } tauri-plugin-window-state = "2.4.0" tempfile = "3.23.0" theseus = { path = "packages/app-lib" } thiserror = "2.0.17" tikv-jemalloc-ctl = "0.6.0" tikv-jemallocator = "0.6.0" tokio = "1.47.1" tokio-stream = "0.1.17" tokio-util = "0.7.16" totp-rs = "5.7.0" tracing = "0.1.41" tracing-actix-web = { version = "0.7.19", default-features = false } tracing-ecs = "0.5.0" tracing-error = "0.2.1" tracing-subscriber = "0.3.20" typed-path = "0.12.0" url = "2.5.7" urlencoding = "2.1.3" utoipa = { version = "5.4.0", features = ["actix_extras", "chrono", "decimal"] } utoipa-actix-web = { version = "0.1.2" } utoipa-swagger-ui = { version = "9.0.2", features = ["actix-web", "vendored"] } uuid = "1.18.1" validator = "0.20.0" webp = { version = "0.3.1", default-features = false } webview2-com = "0.38.0" # Should be updated in lockstep with wry whoami = "1.6.1" windows = "=0.61.3" # Locked on 0.61 until we can update windows-core to 0.62 windows-core = "=0.61.2" # Locked on 0.61 until webview2-com updates to 0.62 winreg = "0.55.0" woothee = "0.13.0" yaserde = "0.12.0" zbus = "5.11.0" zip = { version = "6.0.0", default-features = false, features = [ "bzip2", "deflate", "deflate64", "zstd", ] } zxcvbn = "3.1.0" [workspace.lints.clippy] bool_to_int_with_if = "warn" borrow_as_ptr = "warn" cfg_not_test = "warn" clear_with_drain = "warn" cloned_instead_of_copied = "warn" collection_is_never_read = "warn" dbg_macro = "warn" default_trait_access = "warn" explicit_iter_loop = "warn" filter_map_next = "warn" flat_map_option = "warn" format_push_string = "warn" get_unwrap = "warn" large_include_file = "warn" large_stack_arrays = "warn" manual_assert = "warn" manual_instant_elapsed = "warn" manual_is_variant_and = "warn" manual_let_else = "warn" map_unwrap_or = "warn" match_bool = "warn" needless_collect = "warn" negative_feature_names = "warn" non_std_lazy_statics = "warn" pathbuf_init_then_push = "warn" read_zero_byte_vec = "warn" redundant_clone = "warn" redundant_feature_names = "warn" redundant_type_annotations = "warn" todo = "warn" too_many_arguments = "allow" uninlined_format_args = "warn" unnested_or_patterns = "warn" wildcard_dependencies = "warn" [profile.dev.package.sqlx-macros] opt-level = 3 # Optimize for speed and reduce size on release builds [profile.release] opt-level = "s" # Optimize for binary size strip = true # Remove debug symbols lto = true # Enables link to optimizations panic = "abort" # Strip expensive panic clean-up logic codegen-units = 1 # Compile crates one after another so the compiler can optimize better # Specific profile for labrinth production builds [profile.release-labrinth] inherits = "release" panic = "unwind" # Don't exit the whole app on panic in production