[workspace] resolver = "3" members = ["crates/*"] [workspace.package] version = "1.9.0" edition = "2024" rust-version = "1.88" # raised from 1.85: time >=0.3.47 (RUSTSEC-2026-0009 fix) needs 1.88 license = "AGPL-3.0-only" repository = "https://github.com/schubydoo/podspine" authors = ["schubydoo"] # Comment and doc lints. Each member crate opts in with `[lints] workspace = true`. # CI runs clippy with `-D warnings`, so "warn" here blocks CI but not local builds. [workspace.lints.clippy] # Identifiers in doc comments must have backticks. doc_markdown = "warn" # Each `unsafe` block must have a `// SAFETY:` comment. The workspace has no # `unsafe` today; this lint guards the first one. undocumented_unsafe_blocks = "warn" [workspace.lints.rustdoc] # Each [`item`] link in doc comments must resolve. Fires only under `cargo doc` # (the "Docs (deny warnings)" CI step), not under clippy. broken_intra_doc_links = "deny" # The CI doc step passes `--document-private-items` because this workspace is a # binary, not a library. Links from public items to private items are therefore # valid and stay clickable. private_intra_doc_links = "allow" # Pinned per TAD §3 (verified 2026-07-03). Member crates opt in as each pipeline # stage lands (`axum.workspace = true`, etc.); unreferenced entries stay inert. [workspace.dependencies] # http / serving axum = "0.8.9" axum-range = "1.0.0" axum-extra = { version = "0.12.6", features = ["typed-header"] } tower-http = { version = "0.7", features = ["fs", "timeout", "limit", "trace"] } tokio = { version = "1.52", features = ["full"] } # feed rss = "2.1.0" time = { version = "0.3.47", features = ["formatting", "parsing"] } # >=0.3.47: RUSTSEC-2026-0009 # index / storage (bundled SQLite compiles into the static binary) rusqlite = { version = "0.42", features = ["bundled"] } # ui maud = "0.27" qrcode = { version = "0.14", default-features = false, features = ["svg"] } # tokens (v1.5) getrandom = "0.4" base64 = "0.23" blake3 = "1.5" # scanning / watching notify = "8" # config / cli clap = { version = "4", features = ["derive", "env"] } toml = "1.0" serde = { version = "1", features = ["derive"] } serde_json = "1" # observability tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter"] } # Metrics facade; a no-op unless a recorder is installed (`--metrics-bind`). metrics = "0.24.6" # `default-features = false` drops the crate's own hyper listener and the # rustls/aws-lc-rs push-gateway stack: Podspine renders from the handle and # serves it on its own axum listener, so none of that is reachable. metrics-exporter-prometheus = { version = "0.18.3", default-features = false } # errors thiserror = "2" anyhow = "1" # process control (sync per-child timeout+kill for ffmpeg; the splitter is sync) wait-timeout = "0.2" [package] name = "podspine" description = "Self-hosted server that turns audiobook files into per-chapter podcast RSS feeds." version.workspace = true edition.workspace = true rust-version.workspace = true license.workspace = true repository.workspace = true authors.workspace = true publish = false # cargo-binstall: fetch the prebuilt release binary instead of compiling. # cargo binstall --git https://github.com/schubydoo/podspine podspine # (`--git` because the workspace is publish=false — nothing is on crates.io.) # Our assets are raw binaries named podspine-v{version}-{os}-{arch} with # os=linux|darwin|windows and arch=amd64|arm64, which don't match binstall's # default {target-arch}/{target-os}, so each supported target is mapped here. # The Linux binaries are static musl, so they also serve the -gnu targets. [package.metadata.binstall] pkg-fmt = "bin" [package.metadata.binstall.overrides.x86_64-unknown-linux-musl] pkg-url = "{ repo }/releases/download/v{ version }/podspine-v{ version }-linux-amd64" [package.metadata.binstall.overrides.aarch64-unknown-linux-musl] pkg-url = "{ repo }/releases/download/v{ version }/podspine-v{ version }-linux-arm64" [package.metadata.binstall.overrides.x86_64-unknown-linux-gnu] pkg-url = "{ repo }/releases/download/v{ version }/podspine-v{ version }-linux-amd64" [package.metadata.binstall.overrides.aarch64-unknown-linux-gnu] pkg-url = "{ repo }/releases/download/v{ version }/podspine-v{ version }-linux-arm64" [package.metadata.binstall.overrides.x86_64-apple-darwin] pkg-url = "{ repo }/releases/download/v{ version }/podspine-v{ version }-darwin-amd64" [package.metadata.binstall.overrides.aarch64-apple-darwin] pkg-url = "{ repo }/releases/download/v{ version }/podspine-v{ version }-darwin-arm64" [package.metadata.binstall.overrides.x86_64-pc-windows-msvc] pkg-url = "{ repo }/releases/download/v{ version }/podspine-v{ version }-windows-amd64.exe" [[bin]] name = "podspine" path = "src/main.rs" [dependencies] podspine-config = { path = "crates/config" } podspine-index = { path = "crates/index" } podspine-scanner = { path = "crates/scanner" } podspine-http = { path = "crates/http" } podspine-metrics = { path = "crates/metrics" } tokio = { workspace = true } anyhow = { workspace = true } tracing = { workspace = true } tracing-subscriber = { workspace = true } [lints] workspace = true