Files
k-mood/Cargo.toml
Gabriel Kaszewski bf148902ab spa hardening, offline logging, rate limit fixes
server:
- backup exporter, auth extractors, error shapes, CONTEXT (prior work)
- spa assets served outside the rate limit via route_layer
- requests_per_second went to per_second(), which takes an interval not a
  rate: 50 meant one request per 50s once burst was spent. now converted
  properly. 15/s, burst 60

spa fixes:
- account delete cleared snake_case token keys that were never written
- refresh interceptor could retry forever
- date ranges used local day boundaries stamped +00:00
- "all" period trend plotted one page; calendar days fabricated mood 3
- chart grid invisible: hsl(var(--border)) against rgba tokens
- blob url leak, orphaned media on failed save, devtools in prod bundle
- pt-safe/safe-area-pb classes never existed

spa features:
- offline outbox: entries queue to IndexedDB, replay with backoff, only
  server refusals count against an entry
- drafts persist, quick-log sheet, diary infinite scroll + filters
- route error boundary, stale-chunk recovery, no service worker in dev

a11y + perf:
- mood picker is a radiogroup, activity picker keyboard-operable,
  text alternatives for colour/emoji, locale week start
- dark glass over the bright photo: worst case 1.4:1 -> 4.9-9.6:1
- initial payload 1095->769kB raw, 306->230kB gzip; 38 unused components
  and 5 deps dropped; fonts 218->133kB

53 tests added (43 spa, 10 server)
2026-08-28 15:00:30 +02:00

85 lines
2.9 KiB
TOML

[workspace]
resolver = "2"
members = [
"crates/domain",
"crates/application",
"crates/api-types",
"crates/config",
"crates/adapters/http-axum",
"crates/adapters/sqlite",
"crates/adapters/auth",
"crates/adapters/storage",
"crates/adapters/event-publisher",
"crates/adapters/importer",
"crates/adapters/crypto",
"crates/adapters/music",
"crates/adapters/exporter",
"crates/adapters/weather",
"crates/adapters/web-push",
"crates/bootstrap",
"crates/server",
"crates/worker",
]
default-members = ["crates/server", "crates/worker"]
[workspace.package]
edition = "2024"
version = "0.1.0"
[workspace.dependencies]
domain = { path = "crates/domain" }
application = { path = "crates/application" }
api-types = { path = "crates/api-types" }
config = { path = "crates/config" }
http-axum = { path = "crates/adapters/http-axum" }
sqlite = { path = "crates/adapters/sqlite" }
auth = { path = "crates/adapters/auth" }
storage = { path = "crates/adapters/storage" }
event-publisher = { path = "crates/adapters/event-publisher" }
importer = { path = "crates/adapters/importer" }
crypto = { path = "crates/adapters/crypto" }
music = { path = "crates/adapters/music" }
exporter = { path = "crates/adapters/exporter" }
weather = { path = "crates/adapters/weather" }
web-push-adapter = { path = "crates/adapters/web-push" }
bootstrap = { path = "crates/bootstrap" }
csv = "1"
zip = { version = "8", default-features = false, features = ["deflate"] }
thiserror = "2"
async-trait = "0.1"
uuid = { version = "1", features = ["v4", "serde"] }
chrono = { version = "0.4", features = ["serde"] }
serde = { version = "1", features = ["derive"] }
figment = { version = "0.10", features = ["toml", "env"] }
serde_json = "1"
tokio = { version = "1", features = ["rt-multi-thread", "macros", "signal"] }
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
axum = { version = "0.8", features = ["macros", "multipart"] }
tower = { version = "0.5", features = ["util"] }
http-body-util = "0.1"
tower-http = { version = "0.7", features = ["cors", "trace", "fs"] }
tower_governor = { version = "0.8", default-features = false, features = ["axum"] }
sqlx = { version = "0.9", features = ["runtime-tokio", "sqlite"] }
email_address = "0.2"
chrono-tz = { version = "0.10", features = ["serde"] }
jsonwebtoken = { version = "11", features = ["aws_lc_rs"] }
argon2 = { version = "0.5", features = ["std"] }
object_store = { version = "0.14", features = ["aws"] }
bytes = "1"
base64 = "0.23"
chacha20poly1305 = "0.10"
md-5 = "0.10"
sha2 = "0.10"
rand = "0.9"
reqwest = { version = "0.13", default-features = false, features = ["rustls", "charset", "json", "query"] }
utoipa = { version = "5", features = ["axum_extras", "chrono", "uuid"] }
utoipa-scalar = { version = "0.3", features = ["axum"] }
[profile.release]
lto = true
strip = true
codegen-units = 1
opt-level = 3