[package] name = "pixelpass" version = "0.1.0" edition = "2024" description = "P2P screen sharing CLI over iroh" license = "MIT OR Apache-2.0" publish = false [[bin]] name = "pixelpass" path = "src/main.rs" [dependencies] iroh = "1.0.0-rc.0" tokio = { version = "1", features = ["macros", "rt-multi-thread", "io-util", "net", "signal", "process", "sync", "time"] } tokio-util = { version = "0.7", features = ["io"] } clap = { version = "4", features = ["derive"] } anyhow = "1" thiserror = "2" tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter"] } nix = { version = "0.30", features = ["signal", "process"] } serde = { version = "1", features = ["derive"] } serde_json = "1" directories = "5" ashpd = { version = "0.9", default-features = false, features = ["tokio"] } pipewire = "0.9" x11rb = { version = "0.13", default-features = false, features = ["allow-unsafe-code"] } uuid = { version = "1", features = ["v4"] } iroh-tickets = "1.0.0-rc.0" dialoguer = { version = "0.12", default-features = false } arboard = { version = "3", default-features = false, features = ["wayland-data-control"] } ureq = { version = "3", default-features = false, features = ["rustls"] } toml = "1" chrono = { version = "0.4", default-features = false, features = ["clock", "serde"] } eframe = { version = "0.34.2", default-features = false, features = ["glow", "default_fonts", "wayland", "x11"], optional = true } # Desktop notifications on viewer join/leave. Default features give the # pure-Rust zbus backend (no system libdbus, no image crate). notify-rust = { version = "4", optional = true } # System-tray icon (StatusNotifierItem over D-Bus). Pure-Rust, riding the same # zbus stack notify-rust already pulls — no GTK, no libappindicator/C libdbus. ksni = { version = "0.3", optional = true } # Hand-rolled windowing stack for the GUI (replaces eframe::run_native) so we # can drop the OS window on "hide to tray" — the only way to truly hide a # toplevel on Wayland — and recreate it on Show. All of these are already pulled # in transitively by eframe; making them direct adds no new crates to vet. # eframe is kept for its egui re-export + icon_data PNG decoder. egui_glow needs # its (non-default) `winit` feature for the `EguiGlow` integration type; eframe # pulls egui_glow but without that feature, so we enable it here. egui_glow = { version = "0.34.2", default-features = false, features = ["winit", "wayland", "x11"], optional = true } # winit's default set minus `wayland-csd-adwaita`: KWin (and most desktop # compositors) draw server-side decorations, and eframe never enabled CSD # either, so dropping it keeps the dependency tree identical to before (no # sctk-adwaita / tiny-skia / ttf-parser pulled in just for a fallback titlebar). winit = { version = "0.30", default-features = false, features = ["rwh_06", "x11", "wayland", "wayland-dlopen"], optional = true } glutin = { version = "0.32", optional = true } glutin-winit = { version = "0.5", optional = true } # QR-encode the host ticket so a phone (or a second laptop with a webcam) can # pick it up without typing 140 chars. default-features = false to skip the # `image` crate dep tree — we render the modules to an `egui::ColorImage` # directly. qrcode = { version = "0.14", default-features = false, optional = true } [profile.release] lto = "thin" codegen-units = 1 strip = "symbols" [features] # Opt-in graphical front-end (pixelpass --gui). Default-off so the headless # build never pulls the GUI toolkit tree. gui = ["dep:eframe", "dep:notify-rust", "dep:ksni", "dep:egui_glow", "dep:winit", "dep:glutin", "dep:glutin-winit", "dep:qrcode"]