[workspace] exclude = [ "crates/pinakes-core/tests/fixtures/test-plugin", "examples/plugins/auto-tagger", "examples/plugins/text-enrichment", "examples/plugins/subtitle-detector", "examples/plugins/cbz-comics", ] members = [ "crates/*", "packages/*", "xtask" ] resolver = "3" [workspace.package] edition = "2024" # keep in sync with .rustfmt.toml license = "EUPL-1.2" rust-version = "1.95.0" version = "0.4.0-dev" readme = true [workspace.dependencies] # Crate components for Pinakes. Those are the internal dependencies that are built # while building any package. pinakes-core = { path = "./crates/pinakes-core" } pinakes-enrichment = { path = "./crates/pinakes-enrichment" } pinakes-metadata = { path = "./crates/pinakes-metadata" } pinakes-migrations = { path = "./crates/pinakes-migrations" } pinakes-plugin = { path = "./crates/pinakes-plugin" } pinakes-plugin-api = { path = "./crates/pinakes-plugin-api" } pinakes-sync = { path = "./crates/pinakes-sync" } pinakes-types = { path = "./crates/pinakes-types" } # Pinakes itself is a REST API server. UI and TUI are official visual components # that connect to the server. Using the API documentation, the user can write # their own clients, but we separate "crates" and "packages" to establish the # distinction properly. pinakes-server = { path = "./packages/pinakes-server" } pinakes-tui = { path = "./packages/pinakes-tui" } pinakes-ui = { path = "./packages/pinakes-ui" } # Other dependencies. Declaring them in the virtual manifests lets use reuse the crates # without having to track individual crate version across different types of crates. This # also includes *dev* dependencies. ammonia = "4.1.2" anyhow = "1.0.102" argon2 = { version = "0.5.3", features = [ "std" ] } async-trait = "0.1.89" axum = { version = "0.8.9", features = [ "macros", "multipart" ] } axum-server = { version = "0.8.0" } blake3 = "1.8.5" chrono = { version = "0.4.44", features = [ "serde" ] } clap = { version = "4.6.1", features = [ "derive", "env" ] } crossterm = "0.29.0" deadpool-postgres = "0.14.1" dioxus = { version = "0.7.9", features = [ "desktop", "router" ] } dioxus-core = { version = "0.7.9" } dioxus-free-icons = { version = "0.10.0", features = [ "font-awesome-solid" ] } ed25519-dalek = { version = "2.2.0", features = [ "std" ] } epub = "2.1.5" futures = "0.3.32" gloo-timers = { version = "0.4.0", features = [ "futures" ] } governor = "0.10.4" gray_matter = "0.3.2" http = "1.4.0" http-body-util = "0.1.3" image = { version = "0.25.10", default-features = false, features = [ "jpeg", "png", "webp", "gif", "tiff", "bmp", ] } image_hasher = "3.1.1" kamadak-exif = "0.6.1" lofty = "0.24.0" lopdf = "0.40.0" matroska = "0.30.1" mime_guess = "2.0.5" moka = { version = "0.12.15", features = [ "future" ] } native-tls = "0.2.18" notify = { version = "8.2.0", features = [ "macos_fsevent" ] } percent-encoding = "2.3.2" postgres-native-tls = "0.5.3" postgres-types = { version = "0.2.13", features = [ "derive" ] } pulldown-cmark = "0.13.4" rand = "0.10.1" ratatui = "0.30.0" refinery = { version = "0.9.1", features = [ "tokio-postgres" ] } regex = "1.12.3" reqwest = { version = "0.13.3", features = [ "json", "query", "blocking" ] } rfd = "0.17.2" rusqlite = { version = "0.39.0", features = [ "bundled", "column_decltype" ] } rusqlite_migration = "2.5.0" rustc-hash = "2.1.2" serde = { version = "1.0.228", features = [ "derive" ] } serde_json = "1.0.150" tempfile = "3.27.0" thiserror = "2.0.18" tokio = { version = "1.52.3", features = [ "full" ] } tokio-postgres = { version = "0.7.17", features = [ "with-uuid-1", "with-chrono-0_4", "with-serde_json-1" ] } tokio-util = { version = "0.7.18", features = [ "rt" ] } toml = "1.1.2" tower = "0.5.3" tower-http = { version = "0.6.11", features = [ "cors", "trace", "set-header" ] } tower_governor = "0.8.0" tracing = "0.1.44" tracing-subscriber = { version = "0.3.23", features = [ "env-filter", "json" ] } url = "2.5" urlencoding = "2.1.3" utoipa = { version = "5.5.0", features = [ "axum_extras", "uuid", "chrono" ] } utoipa-axum = { version = "0.2.0" } utoipa-swagger-ui = { version = "9.0.2", features = [ "axum" ] } uuid = { version = "1.23.1", features = [ "v7", "serde" ] } walkdir = "2.5.0" wasmtime = { version = "45.0.0", features = [ "component-model" ] } winnow = "1.0.3" wit-bindgen = "0.57.1" # 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" significant_drop_tightening = "allow" # rusqlite Statement<'conn> borrows the guard; cannot drop early similar_names = "allow" single_call_fn = "allow" std_instead_of_core = "allow" too_long_first_doc_paragraph = "allow" too_many_arguments = "allow" too_many_lines = "allow" undocumented_unsafe_blocks = "warn" unnecessary_safety_comment = "warn" unused_result_ok = "warn" unused_trait_names = "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] argon2 = { opt-level = 3 } blake3 = { opt-level = 3 } image = { opt-level = 3 } lofty = { opt-level = 3 } lopdf = { opt-level = 3 } matroska = { opt-level = 3 } regex = { opt-level = 3 }