[package] name = "calrs" version = "2.0.0-beta.4" edition = "2021" description = "A fast, self-hostable scheduling platform. Like Cal.com, but written in Rust." license = "AGPL-3.0" repository = "https://github.com/olivierlambert/calrs" [[bin]] name = "calrs" path = "src/main.rs" [dependencies] # CLI clap = { version = "4", features = ["derive", "env"] } # Async runtime tokio = { version = "1", features = ["full"] } async-trait = "0.1" # Database sqlx = { version = "0.7", features = ["runtime-tokio-rustls", "sqlite", "migrate", "chrono", "uuid"] } # HTTP client (for CalDAV). `http2` and `charset` are on by default in # reqwest 0.12 but off here with the default features (which would bring # native-tls): 0.11 always offered HTTP/2 and decoded text() by charset. reqwest = { version = "0.12", features = ["rustls-tls", "json", "http2", "charset"], default-features = false } # XML (CalDAV/WebDAV multistatus responses) quick-xml = "0.39" # Charset decoding of capped CalDAV bodies, as reqwest's text() does it encoding_rs = "0.8" # Time & timezone chrono = { version = "0.4", features = ["serde"] } chrono-tz = "0.8" # Serialization serde = { version = "1", features = ["derive"] } serde_json = "1" # IDs uuid = { version = "1", features = ["v4", "serde"] } # Error handling anyhow = "1" # Secrets / config directories = "5" # Terminal output colored = "2" tabled = "0.15" hex = "0.4" rpassword = "7" # Email (SMTP) lettre = { version = "0.11", default-features = false, features = ["tokio1-rustls-tls", "builder", "smtp-transport", "hostname"] } # Web server axum = { version = "0.8", features = ["macros", "multipart"] } axum-extra = { version = "0.10", features = ["cookie", "form"] } minijinja = { version = "2", features = ["loader", "json"] } tower-http = { version = "0.6", features = ["trace", "set-header"] } # Logging tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter"] } # Encryption (credential storage) aes-gcm = "0.10" # Wipes the expanded AES key schedule when a cipher is dropped (#85). aes = { version = "0.8", features = ["zeroize"] } zeroize = "1" # HMAC-SHA256 for outbound webhook signatures hmac = "0.12" sha2 = "0.10" # Auth argon2 = { version = "0.5", features = ["rand"] } rand = "0.8" base64 = "0.22" subtle = "2" totp-rs = { version = "6", default-features = false, features = ["std", "qr", "zeroize"] } openidconnect = { version = "4.0.1", default-features = false, features = ["reqwest", "rustls-tls"] } iana-time-zone = "0.1.65" urlencoding = "2" # Markdown (bio rendering) pulldown-cmark = { version = "0.12", default-features = false, features = ["html"] } # Browser launch (CLI OAuth2) open = "5" # OpenAPI document of the REST API (#169), generated from the handlers utoipa = { version = "6", features = ["preserve_order", "preserve_path_order"] } # Localization (Fluent) fluent-bundle = "0.15" unic-langid = "0.9" [dev-dependencies] tower = { version = "0.5", features = ["util"] } http-body-util = "0.1" # The source guards in src/web/tests/guards.rs walk struct literals with a # real Rust parser; span-locations gives them line numbers. syn = { version = "2", features = ["full", "visit"] } proc-macro2 = { version = "1", features = ["span-locations"] } [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(tarpaulin)'] } # chrono-tz 0.8.6 with its tz data replaced by IANA tzdata 2026b, for British # Columbia's move to permanent -07. No chrono-tz release carries 2026 data yet. # See vendor/chrono-tz/CALRS.md for how to refresh it, and drop this patch once # a chrono-tz release has the data. [patch.crates-io] chrono-tz = { path = "vendor/chrono-tz" }