[workspace]
members = ["utils/camera-impersonator", "utils/ws-utils"]
[package]
name = "oko"
version = "0.1.14"
authors = ["Piotr Placzek <piotrpdev@gmail.com>"]
edition = "2021"
rust-version = "1.73"
description = "Fully local home security system."
repository = "https://github.com/piotrpdev/oko"
license = "GPL-3.0-only"
keywords = ["rust", "axum", "camera", "security", "home"]
include = [".sqlx/", "migrations/", "src/", "static/", "build.rs"]
[workspace.dependencies]
futures-util = { version = "0.3.31", default-features = false }
tokio = { version = "1.34.0", features = ["fs", "signal", "rt-multi-thread", "net", "time", "macros"] }
opencv = { version = "0.93.3", default-features = false, features = ["imgcodecs", "videoio"] }
[dependencies]
async-trait = "0.1.74"
axum = { version = "0.7.5", default-features = false, features = ["form", "http1", "http2", "json", "ws"] }
axum-login = "0.16.0"
http = "1.0.0"
password-auth = { version = "1.0.0", default-features = false, features = ["argon2"] }
serde = "1.0.0"
sqlx = { version = "0.8.1", default-features = false, features = ["json", "sqlite"] }
libsqlite3-sys = { version = "0.30.1", default-features = false, features = ["bundled-sqlcipher"] }
time = { version = "0.3.30", default-features = false }
tokio = { workspace = true }
futures-util = { workspace = true }
tracing-subscriber = { version = "0.3.18", default-features = false, features = ["env-filter", "fmt"] }
tower-sessions = { version = "0.13.0", default-features = false, features = ["signed"] }
tower-sessions-sqlx-store = { version = "0.14.0", features = ["sqlite"] }
thiserror = { version = "2.0.6", default-features = false }
serde_json = "1.0.132"
tracing = { version = "0.1.40", default-features = false }
tower-http = { version = "0.6.1", features = ["fs"] }
opencv = { workspace = true }
tokio-util = { version = "0.7.12", features = ["rt"] }
axum-embed = "0.1.0"
rust-embed = "8.5.0"
serde_bytes = "0.11.15"
mdns = { package = "oko-mdns", version = "5.2.5" }
tokio-stream = { version = "0.1.17", features = ["sync"] }
async-stream = "0.3.6"
reqwest = { version = "0.12.15", default-features = false }
local-ip-address = "=0.6.3"
axum-server = { version = "0.7.2", features = ["tls-rustls"] }
[dev-dependencies]
playwright = { version = "0.0.20", default-features = false, features = ["rt-tokio"] }
tempfile = "3.14.0"
ws-utils = { path = "utils/ws-utils" }
[lints.rust]
unsafe_code = "forbid"
unused_imports = "warn"
unused_variables = "deny"
unused_must_use = "deny"
dead_code = "warn"
missing_docs = "allow"
async_fn_in_trait = "allow"
[lints.clippy]
all = { level = "warn", priority = -1 }
pedantic = { level = "warn", priority = -1 }
nursery = { level = "warn", priority = -1 }
redundant_pub_crate = "warn"
unwrap_used = "warn"
expect_used = "warn"
panic = "deny"
unreachable = "deny"
todo = "deny"
unimplemented = "deny"
await_holding_lock = "deny"
indexing_slicing = "deny"
float_cmp = "deny"
modulo_one = "deny"
missing_errors_doc = "allow"