[workspace] resolver = "2" members = [ "crates/hoard-core", "crates/hoard-deflate", "crates/hoard-server", "crates/hoard-cli", "crates/hoard-admin", "crates/hoard-agent", "crates/hoard-desktop", "crates/hoardd", "crates/hoard-manifest", "crates/hoard-installer", ] # The benchmark harness is a development tool and is never published, so it is # not a member either. A member missing from a clean clone doesn't just fail to # build itself: `cargo build --workspace` aborts before compiling anything, so # the whole tree, server included, stops building. Excluded, its absence goes # unnoticed; it carries its own `[workspace]` table to still build standalone. exclude = ["crates/hoard-pruebas"] [workspace.package] edition = "2021" version = "1.3.0" authors = ["insider "] license = "AGPL-3.0" # Self-hosted app, never published to crates.io. Marking the members private # also tells cargo-deny to apply `allow-wildcard-paths` to our intra-workspace # path deps (the exemption is skipped for publishable crates). publish = false [workspace.dependencies] # Async runtime tokio = { version = "1", features = ["full"] } # HTTP server axum = { version = "0.7", features = ["multipart"] } tower = "0.4" tower-http = { version = "0.5", features = ["trace", "cors", "compression-gzip", "compression-zstd"] } # HTTP client. # # TLS is rustls, not the OpenSSL-backed default, and that is a portability fix # rather than a preference. With `default-tls` the binary links the build # machine's libssl, which carries that machine's OPENSSLDIR baked in # (`/usr/lib/ssl` on Ubuntu). The `.deb` gets away with it because it runs on # the same family, but the AppImage bundles that libssl and travels: on # Arch-derived systems (SteamOS, Bazzite) keep nothing at `/usr/lib/ssl`, so # every handshake dies with `certificate verify failed` plus a `stat # (/usr/lib/ssl/certs)` in the error, and the app can reach nothing at all. # # Both root stores are on, and both are load-bearing: webpki ships the Mozilla # roots inside the binary so a handshake works on any distro whatever it keeps # on disk, and the native store is what still lets a self-hosted server with a # private CA in the system trust be reached. reqwest merges the two. reqwest = { version = "0.12", default-features = false, features = [ "json", "multipart", "stream", "charset", "http2", "gzip", "zstd", "system-proxy", "rustls-tls-native-roots", "rustls-tls-webpki-roots", ] } # Database sqlx = { version = "0.8", features = ["runtime-tokio", "sqlite", "migrate", "time", "uuid"] } # Serialization serde = { version = "1", features = ["derive"] } serde_json = "1" toml = "0.8" # CLI args clap = { version = "4", features = ["derive", "env"] } # Logging tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] } # File-rotating tracing layer for `hoard sync run` (so the Windows Task # Scheduler service leaves a tail-able log behind; macOS launchd already # redirects via the plist). Also used by hoard-desktop. tracing-appender = "0.2" # Error handling anyhow = "1" thiserror = "1" # Crypto argon2 = "0.5" blake3 = "1" sha2 = "0.10" hex = "0.4" rand = "0.8" base64 = "0.22" # CLI password prompt (login Cloud sin echo) rpassword = "7" # Compression async-compression = { version = "0.4", features = ["tokio", "zstd", "gzip"] } tokio-tar = "0.3" # Synchronous zstd for the embedded Ludusavi catalog. Already in the tree as # a transitive dep of async-compression, so this costs no extra build. zstd = "0.13" # Time time = { version = "0.3", features = ["serde", "serde-well-known", "formatting", "parsing", "macros"] } # UUID uuid = { version = "1", features = ["v4", "serde"] } # YAML (Ludusavi manifest) serde_yaml = "0.9" # Misc tokio-stream = "0.1" figment = { version = "0.10", features = ["toml", "env"] } directories = "5" indicatif = "0.17" tokio-util = { version = "0.7", features = ["io"] } futures = "0.3" bytes = "1" regex = "1" strsim = "0.11" # Process & filesystem watching (Phase 4) sysinfo = { version = "0.32", default-features = false, features = ["system"] } notify = "6" notify-debouncer-mini = "0.4" # Native OS notifications from `hoardd` (ADR 0021 D.14.1). Mind the names: # `notify` above watches the filesystem and `notify-rust` tells the user, and they # have nothing to do with each other. It was already in the tree as a transitive # dependency of `tauri-plugin-notification`, so the service and the app take # exactly the same path to `org.freedesktop.Notifications`. notify-rust = "4" # Object-safe async traits (`hoard-server` BlobStore abstraction). async-trait = "0.1" # HKCU registry access. `hoard-agent` writes the user PATH with it; `hoardd` # writes the Run entry that starts the service at logon when the Task Scheduler # refuses to register a task without an elevated console. winreg = "0.52" # Test-only, used by per-crate `[dev-dependencies]` blocks. tempfile = "3" # Property-based testing with automatic shrinking. Test-only; drives the # kernel reconciler's invariant suite (ADR 0021, Slice 2): random tick # sequences that shrink to a minimal counterexample when an invariant breaks. proptest = "1" # ZIP writer for cloud account exports (server, `cloud` feature). No default # features: game saves are already compressed, so export entries are `Stored` # (no re-deflate): we only need the archive container, not compression. zip = { version = "2", default-features = false } # Smaller, slightly faster release binaries (desktop bundle, server, sidecar). # Thin LTO + one codegen unit trade release-build time for output quality; # strip drops the symbol table; panics still print message and file:line, which # is what we actually read in the field. [profile.release] lto = "thin" codegen-units = 1 strip = true