Single-binary self-hosted website analytics on Rust axum: collector API, dashboards, world map, and PDF reports.
analyticsaxumdockerrustself-hostedsqliteviteweb-analytics
1[package]
2name = "analytics"
3version = "0.1.0"
4edition = "2021"
5default-run = "analytics"
6
7[dependencies]
8axum = { version = "0.8", features = ["macros"] }
9tokio = { version = "1", features = ["full"] }
10tower = { version = "0.5", features = ["util"] }
11tower-http = { version = "0.6", features = ["fs", "cors", "trace", "set-header"] }
12tower-cookies = { version = "0.11", features = ["signed"] }
13minijinja = { version = "2", features = ["loader", "loop_controls", "json"] }
14serde = { version = "1", features = ["derive"] }
15serde_json = "1"
16serde_urlencoded = "0.7"
17sqlx = { version = "0.8", default-features = false, features = ["runtime-tokio", "sqlite", "macros", "migrate", "chrono", "uuid"] }
18uuid = { version = "1", features = ["v4", "serde"] }
19chrono = { version = "0.4", features = ["serde"] }
20chrono-tz = "0.10"
21maxminddb = "0.24"
22uaparser = "0.6"
23hmac = "0.12"
24sha2 = "0.10"
25base64 = "0.22"
26rand = "0.8"
27dotenvy = "0.15"
28anyhow = "1"
29thiserror = "2"
30tracing = "0.1"
31tracing-subscriber = { version = "0.3", features = ["env-filter"] }
32reqwest = { version = "0.12", default-features = false, features = ["rustls-tls", "stream"] }
33flate2 = "1"
34tar = "0.4"
35mime_guess = "2"
36urlencoding = "2"
37futures-util = "0.3"
38typst = "0.14"
39typst-pdf = "0.14"
40typst-kit = { version = "0.14", default-features = false, features = ["fonts", "embed-fonts"] }
41
42[profile.release]
43# Skip LTO so release builds stay tractable on the 1-vCPU alpine VPS once
44# typst-library entered the dep tree. codegen-units defaults to 16.
45strip = true