[workspace] members = ["crates/*"] exclude = ["crates/pinakes-core/tests/fixtures/test-plugin"] resolver = "3" [workspace.package] edition = "2024" # keep in sync with .rustfmt.toml version = "0.3.0-dev" license = "EUPL-1.2" readme = true rust-version = "1.95.0" # follows nightly Rust [workspace.dependencies] # Crate components for Pinakes. pinakes-core = { path = "./crates/pinakes-core" } pinakes-server = { path = "./crates/pinakes-server" } pinakes-plugin-api = { path = "./crates/pinakes-plugin-api" } pinakes-ui = { path = "./crates/pinakes-ui" } pinakes-tui = { path = "./crates/pinakes-tui" } # Async runtime tokio = { version = "1.49.0", features = ["full"] } tokio-util = { version = "0.7.18", features = ["rt"] } # Serialization serde = { version = "1.0.228", features = ["derive"] } serde_json = "1.0.149" toml = "1.0.3" # CLI argument parsing clap = { version = "4.5.60", features = ["derive", "env"] } # Date/time chrono = { version = "0.4.44", features = ["serde"] } # IDs uuid = { version = "1.21.0", features = ["v7", "serde"] } # Error handling thiserror = "2.0.18" anyhow = "1.0.102" # Logging tracing = "0.1.44" tracing-subscriber = { version = "0.3.22", features = ["env-filter", "json"] } # Hashing blake3 = "1.8.3" # Cryptographic signatures (plugin verification) ed25519-dalek = { version = "2.1.1", features = ["std"] } # Metadata extraction lofty = "0.23.2" lopdf = "0.39.0" epub = "2.1.5" matroska = "0.30.0" gray_matter = "0.3.2" kamadak-exif = "0.6.1" # Database - SQLite rusqlite = { version = "=0.37.0", features = ["bundled", "column_decltype"] } # Database - PostgreSQL tokio-postgres = { version = "0.7.16", features = [ "with-uuid-1", "with-chrono-0_4", "with-serde_json-1", ] } deadpool-postgres = "0.14.1" postgres-types = { version = "0.2.12", features = ["derive"] } postgres-native-tls = "0.5.2" native-tls = "0.2.18" # Migrations refinery = { version = "0.9.0", features = ["rusqlite", "tokio-postgres"] } # Filesystem walkdir = "2.5.0" notify = { version = "8.2.0", features = ["macos_fsevent"] } # Search parser winnow = "0.7.14" # HTTP server axum = { version = "0.8.8", features = ["macros", "multipart"] } axum-server = { version = "0.8.0" } tower = "0.5.3" tower-http = { version = "0.6.8", features = ["cors", "trace", "set-header"] } governor = "0.10.4" tower_governor = "0.8.0" # HTTP client reqwest = { version = "0.13.2", features = ["json", "query", "blocking"] } url = "2.5" # TUI ratatui = "0.30.0" crossterm = "0.29.0" # Desktop/Web UI dioxus = { version = "0.7.3", features = ["desktop", "router"] } dioxus-core = { version = "0.7.3" } # Async trait (dyn-compatible async methods) async-trait = "0.1.89" # Async utilities futures = "0.3.32" # Image processing (thumbnails) image = { version = "0.25.9", default-features = false, features = [ "jpeg", "png", "webp", "gif", "tiff", "bmp", ] } # Markdown rendering pulldown-cmark = "0.13.1" ammonia = "4.1.2" # Password hashing argon2 = { version = "0.5.3", features = ["std"] } # Misc mime_guess = "2.0.5" regex = "1.12.3" dioxus-free-icons = { version = "0.10.0", features = ["font-awesome-solid"] } rfd = "0.17.2" gloo-timers = { version = "0.3.0", features = ["futures"] } rand = "0.10.0" moka = { version = "0.12.14", features = ["future"] } urlencoding = "2.1.3" image_hasher = "3.1.1" percent-encoding = "2.3.2" http = "1.4.0" # WASM runtime for plugins wasmtime = { version = "42.0.1", features = ["component-model"] } wit-bindgen = "0.53.1" # Misc tempfile = "3.26.0" # See: # [workspace.lints.clippy] cargo = { level = "warn", priority = -1 } complexity = { level = "warn", priority = -1 } nursery = { level = "warn", priority = -1 } pedantic = { level = "warn", priority = -1 } perf = { level = "warn", priority = -1 } style = { level = "warn", priority = -1 } # The lint groups above enable some less-than-desirable rules, we should manually # enable those to keep our sanity. absolute_paths = "allow" arbitrary_source_item_ordering = "allow" clone_on_ref_ptr = "warn" dbg_macro = "warn" empty_drop = "warn" empty_structs_with_brackets = "warn" exit = "warn" filetype_is_file = "warn" get_unwrap = "warn" implicit_return = "allow" infinite_loop = "warn" map_with_unused_argument_over_ranges = "warn" missing_docs_in_private_items = "allow" multiple_crate_versions = "allow" # :( non_ascii_literal = "allow" non_std_lazy_statics = "warn" pathbuf_init_then_push = "warn" pattern_type_mismatch = "allow" question_mark_used = "allow" rc_buffer = "warn" rc_mutex = "warn" rest_pat_in_fully_bound_structs = "warn" similar_names = "allow" single_call_fn = "allow" std_instead_of_core = "allow" too_long_first_doc_paragraph = "allow" too_many_lines = "allow" undocumented_unsafe_blocks = "warn" unnecessary_safety_comment = "warn" unused_result_ok = "warn" unused_trait_names = "allow" too_many_arguments = "allow" # False positive: # clippy's build script check doesn't recognize workspace-inherited metadata # which means in our current workspace layout, we get pranked by Clippy. cargo_common_metadata = "allow" # In the honor of a recent Cloudflare regression panic = "deny" unwrap_used = "deny" # Less dangerous, but we'd like to know # Those must be opt-in, and are fine ONLY in tests and examples. expect_used = "warn" print_stderr = "warn" print_stdout = "warn" todo = "warn" unimplemented = "warn" unreachable = "warn" [profile.dev.package] blake3 = { opt-level = 3 } image = { opt-level = 3 } regex = { opt-level = 3 } argon2 = { opt-level = 3 } matroska = { opt-level = 3 } lopdf = { opt-level = 3 } lofty = { opt-level = 3 }