1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
[]
= "feather-reader"
= "0.2.4"
= "2021"
= "1.94"
= "A minimalist, atproto-native RSS/Atom reader in Rust — your feed subscriptions live in your own PDS."
= ["Justin Stanley"]
= "AGPL-3.0-only"
= "https://github.com/justin-stanley/feather-reader"
= "https://feather-reader.com"
= "README.md"
= ["rss", "atom", "atproto", "feed", "reader"]
= ["web-programming"]
# The crate ships a small library (shared types + module seams) and the server binary.
[]
= "feather_reader"
= "src/lib.rs"
[[]]
= "featherreader"
= "src/main.rs"
[]
# --- async runtime -------------------------------------------------------
= { = "1.45", = ["full"] }
# --- web framework + middleware -----------------------------------------
# `multipart` powers the OPML file-upload import (POST /opml).
= { = "0.8", = ["multipart"] }
# fs = ServeDir/ServeFile for embedded/static assets; trace = request tracing
# layer; set-header = the global security-header layer (CSP + friends).
= { = "0.7", = ["fs", "trace", "set-header"] }
# --- HTTP client (feed fetch) -------------------------------------------
# default-features off to drop the OpenSSL/native-tls path; rustls keeps the
# static-binary story clean. gzip for polite/compressed feed fetches.
= { = "0.13", = false, = ["rustls", "gzip", "json"] }
# --- feed parsing --------------------------------------------------------
= "2.4"
# --- HTML sanitization (feeds are hostile input) -------------------------
= "4"
# --- local per-DID SQLite cache -----------------------------------------
# RUNTIME queries only (no compile-time `query!` macros, so no DATABASE_URL at
# build). sqlx 0.9 splits the old `runtime-tokio-rustls` feature into
# `runtime-tokio` + `tls-rustls-ring`. `sqlite-bundled` links SQLite into the
# binary for the single-file deploy story; `migrate` runs embedded migrations.
= { = "0.9", = false, = [
"runtime-tokio",
"tls-rustls-ring",
"sqlite-bundled",
"migrate",
"chrono",
# `derive` pulls in sqlx-macros so the store's row structs can
# `#[derive(FromRow)]` — the derive macro, not just the `FromRow` trait.
"derive",
] }
# --- HTML templating (compile-time, embedded in the binary) --------------
# askama 0.16 dropped the separate `askama_axum` integration crate (deprecated,
# pinned to askama <0.13). `askama_web` provides the axum IntoResponse glue.
= "0.16"
= { = "0.16", = ["axum-0.8"] }
# --- serde ---------------------------------------------------------------
= { = "1", = ["derive"] }
= "1"
# --- error handling ------------------------------------------------------
= "1"
= "2"
# --- tracing -------------------------------------------------------------
= "0.1"
= { = "0.3", = ["env-filter", "fmt"] }
# --- time / dates --------------------------------------------------------
= { = "0.4", = ["serde"] }
# --- URL parsing (feed autodiscovery, canonicalization) ------------------
= "2"
# --- CSPRNG (opaque, unguessable session ids) ----------------------------
# Already in the dependency tree transitively; pinned here as a direct dep so
# the session-id minting reads from the OS CSPRNG rather than a home-rolled RNG.
= "0.4"
# --- filesystem stat (startup disk-headroom check) -----------------------
# Already in the tree transitively; pinned as a direct dep so the startup
# watermark-vs-disk safety check can call `statvfs(3)` on unix to compare the
# configured DB-size watermark against the DB volume's actual free space. Unix
# only — the target deploys are Linux/Fly and the check no-ops elsewhere.
[]
= "0.2"
[]
# `ServiceExt::oneshot` drives the axum router through a single request in the
# web-layer tests (cache-control headers, rate-limit 429, the pre-handshake
# login refusal, admin-mint authz). Already in the lock transitively; the `util`
# feature exposes `oneshot`.
= { = "0.5", = ["util"] }