[workspace]
resolver = "3"
members = [
"checks",
"ts_array256",
"ts_bart",
"ts_bart_packetfilter",
"ts_bitset",
"ts_capabilityversion",
"ts_cli_util",
"ts_control",
"ts_control_noise",
"ts_control_serde",
"ts_dataplane",
"ts_devtools",
"ts_disco_protocol",
"ts_disco_protocol",
"ts_dynbitset",
"ts_elixir/native/ts_elixir",
"ts_ffi",
"ts_hexdump",
"ts_http_util",
"ts_keys",
"ts_netcheck",
"ts_netstack_smoltcp",
"ts_netstack_smoltcp_core",
"ts_netstack_smoltcp_socket",
"ts_nodecapability",
"ts_overlay_router",
"ts_packet",
"ts_packetfilter",
"ts_packetfilter_serde",
"ts_packetfilter_state",
"ts_peercapability",
"ts_python",
"ts_runtime",
"ts_test_util",
"ts_time",
"ts_tls_util",
"ts_transport",
"ts_transport_derp",
"ts_transport_tun",
"ts_underlay_router",
"ts_tunnel",
]
[workspace.package]
edition = "2024"
license = "BSD-3-Clause"
publish = true
version = "0.2.0"
repository = "https://github.com/tailscale/tailscale-rs"
rust-version = "1.91.0"
[workspace.dependencies]
aead = { version = "0.5", features = ["std"] }
base64 = "0.22"
blake2 = "0.10"
bytes = "1"
cfg-if = "1.0"
chacha20poly1305 = "0.10"
chrono = { version = "0.4", default-features = false }
clap = { version = "4", features = ["derive"] }
crypto_box = { version = "0.9" }
divan = "0.1"
flume = "0.12"
futures = { version = "0.3", default-features = false }
futures-util = { version = "0.3", default-features = false }
hashbrown = "0.16"
heapless = "0.9"
hex = "0.4"
hkdf = { version = "0.12", features = ["std"] }
http = "1.4"
httparse = "1"
http-body-util = "0.1"
hyper = { version = "1", default-features = false, features = ["http2"] }
hyper-util = { version = "0.1", default-features = false, features = ["http1"] }
ipnet = { version = "2.12", default-features = false }
lazy_static = "1.5"
pin-project-lite = "0.2"
proptest = "1"
itertools = "0.14"
rand = "0.10"
reqwest = "0.13"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
serde_with = "3"
smallvec = "1.15"
static_assertions = "1.1"
smoltcp = { version = "0.13", default-features = false }
thiserror = { version = "2", default-features = false }
tokio = { version = "1", default-features = false, features = ["rt-multi-thread", "macros"] }
tokio-util = { version = "0.7", default-features = false }
tracing = { version = "0.1", default-features = false, features = ["attributes"] }
tracing-test = "0.2"
url = { version = "2", default-features = false }
x25519-dalek = { version = "3.0.0-pre.6", features = ["getrandom", "reusable_secrets", "static_secrets"] }
yoke = { version = "0.8", default-features = false }
zerocopy = { version = "0.8", features = ["derive"] }
tailscale = { path = ".", version = "0.2.0" }
ts_array256 = { path = "ts_array256", version = "0.2.0" }
ts_bart = { path = "ts_bart", version = "0.2.0" }
ts_bart_packetfilter = { path = "ts_bart_packetfilter", version = "0.2.0" }
ts_bitset = { path = "ts_bitset", default-features = false, version = "0.2.0" }
ts_capabilityversion = { path = "ts_capabilityversion", version = "0.2.0" }
ts_cli_util = { path = "ts_cli_util" }
ts_control = { path = "ts_control", version = "0.2.0" }
ts_control_noise = { path = "ts_control_noise", version = "0.2.0" }
ts_control_serde = { path = "ts_control_serde", version = "0.2.0" }
ts_dataplane = { path = "ts_dataplane", version = "0.2.0" }
ts_disco_protocol = { path = "ts_disco_protocol", version = "0.2.0" }
ts_dynbitset = { path = "ts_dynbitset", version = "0.2.0" }
ts_hexdump = { path = "ts_hexdump", version = "0.2.0" }
ts_keys = { path = "ts_keys", version = "0.2.0" }
ts_netcheck = { path = "ts_netcheck", version = "0.2.0" }
ts_netstack_smoltcp = { path = "ts_netstack_smoltcp", version = "0.2.0" }
ts_netstack_smoltcp_core = { path = "ts_netstack_smoltcp_core", version = "0.2.0" }
ts_netstack_smoltcp_socket = { path = "ts_netstack_smoltcp_socket", version = "0.2.0" }
ts_nodecapability = { path = "ts_nodecapability", version = "0.2.0" }
ts_overlay_router = { path = "ts_overlay_router", version = "0.2.0" }
ts_packet = { path = "ts_packet", version = "0.2.0" }
ts_packetfilter = { path = "ts_packetfilter", version = "0.2.0" }
ts_packetfilter_serde = { path = "ts_packetfilter_serde", version = "0.2.0" }
ts_packetfilter_state = { path = "ts_packetfilter_state", version = "0.2.0" }
ts_peercapability = { path = "ts_peercapability", version = "0.2.0" }
ts_http_util = { path = "ts_http_util", version = "0.2.0" }
ts_tls_util = { path = "ts_tls_util", version = "0.2.0" }
ts_runtime = { path = "ts_runtime", version = "0.2.0" }
ts_test_util = { path = "ts_test_util" }
ts_time = { path = "ts_time", version = "0.2.0" }
ts_transport = { path = "ts_transport", version = "0.2.0" }
ts_transport_derp = { path = "ts_transport_derp", version = "0.2.0" }
ts_transport_tun = { path = "ts_transport_tun", version = "0.2.0" }
ts_underlay_router = { path = "ts_underlay_router", version = "0.2.0" }
ts_tunnel = { path = "ts_tunnel", version = "0.2.0" }
[workspace.lints.rust]
closure_returning_async_block = "warn"
let-underscore = "warn"
missing_docs = "warn"
[workspace.lints.clippy]
cargo = { level = "warn", priority = -1 }
too_many_arguments = "allow"
multiple_crate_versions = "allow"
[workspace.lints.rustdoc]
bare_urls = "deny"
broken_intra_doc_links = "deny"
invalid_html_tags = "deny"
private_intra_doc_links = "deny"
[profile.release]
lto = true
opt-level = "s"
split-debuginfo = "packed"
strip = true
[profile.bench]
debug = true
opt-level = 3
split-debuginfo = "off"
codegen-units = 1
strip = false
[profile.faststrip]
debug = false
lto = true
opt-level = 3
split-debuginfo = "off"
codegen-units = 1
incremental = false
strip = true
inherits = "release"
[package]
name = "tailscale"
version.workspace = true
description = "A work-in-progress Tailscale implementation"
categories = ["network-programming", "api-bindings", "authentication", "asynchronous"]
keywords = ["tailscale", "networking"]
repository.workspace = true
edition.workspace = true
license.workspace = true
rust-version.workspace = true
[package.metadata.docs.rs]
all-features = true
[dependencies]
ts_runtime.workspace = true
ts_control.workspace = true
ts_netstack_smoltcp = { workspace = true, features = ["tokio"] }
ts_keys.workspace = true
axum = { version = "0.8", optional = true }
rand.workspace = true
serde.workspace = true
serde_json.workspace = true
thiserror.workspace = true
tokio = { workspace = true, features = ["fs"] }
tracing.workspace = true
url.workspace = true
[dev-dependencies]
clap = { workspace = true, features = ["derive"] }
include_dir = "0.7"
mime_guess = "2.0"
tokio = { workspace = true, features = ["full"] }
tracing = { workspace = true, features = ["release_max_level_info"] }
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
ts_keys.workspace = true
[lints]
workspace = true
[features]
axum = ["dep:axum"]
[[example]]
name = "axum"
required-features = ["axum"]
[[example]]
name = "peer_ping"
[[example]]
name = "tcp_echo"